Post

JWT

๐Ÿ’ก JWT ๊ณต์‹ ์‚ฌ์ดํŠธ : https://jwt.io/

image

JWT(JSON Web Token)๋Š”

๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์ธํ„ฐ๋„ท ํ‘œ์ค€ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ์จ

ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์—์„œ ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ JSON ํฌ๋งท์˜ ํ† ํฐ ์ •๋ณด๋ฅผ ์ธ์ฝ”๋”ฉ ํ›„,

์ธ์ฝ”๋”ฉ ๋œ ํ† ํฐ ์ •๋ณด๋ฅผ Secret Key๋กœ ์„œ๋ช…(Sign)ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ Web Token์œผ๋กœ์จ ์ธ์ฆ ๊ณผ์ •์— ์‚ฌ์šฉ


JWT์˜ ์ข…๋ฅ˜

  1. ์•ก์„ธ์Šค ํ† ํฐ(Access Token)
  2. ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ(Refresh Token)

Access Token์€ ๋ณดํ˜ธ๋œ ์ •๋ณด๋“ค(์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ, ์—ฐ๋ฝ์ฒ˜, ์‚ฌ์ง„ ๋“ฑ)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ์— ์‚ฌ์šฉ

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฒ˜์Œ ์ธ์ฆ์„ ๋ฐ›๊ฒŒ ๋  ๋•Œ(๋กœ๊ทธ์ธ ์‹œ), Access Token๊ณผ Refresh Token ๋‘ ๊ฐ€์ง€๋ฅผ ๋‹ค ๋ฐ›์ง€๋งŒ, ์‹ค์ œ๋กœ ๊ถŒํ•œ์„ ์–ป๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์€ Access Token์ž…๋‹ˆ๋‹ค.

๊ถŒํ•œ์„ ๋ถ€์—ฌ๋ฐ›๋Š” ๋ฐ์—” Access Token๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋˜์ง€๋งŒ

์ด Access Token์„ ๋งŒ์•ฝ ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ํƒˆ์ทจํ•œ๋‹ค๋ฉด? ๐Ÿค”ย ๋ฌธ์ œ๊ฐ€ ๋˜๊ธฐ๋•Œ๋ฌธ์—

โญ Access Token์—๋Š” ๋น„๊ต์  ์งง์€ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ฃผ์–ด ํƒˆ์ทจ๋˜๋”๋ผ๋„

์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค

Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋œ๋‹ค๋ฉด Refresh Token์„ ์‚ฌ์šฉํ•˜์—ฌ

์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ์‚ฌ์šฉ์ž๋Š” ๋‹ค์‹œ ๋กœ๊ทธ์ธ ์ธ์ฆ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Refresh Token ๋„ ํƒˆ์ทจ๋‹นํ•œ๋‹ค๋ฉด? ๐Ÿค”

์œ ํšจ๊ธฐ๊ฐ„์ด ๊ธด Refresh Token ๋งˆ์ € ํƒˆ์ทจ๋‹นํ•˜๋ฉด ๋” ํฐ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค

Refresh Token์„ ์ด์šฉํ•ด Access Token์„ ๋‹ค์‹œ ๋ฐœ๊ธ‰๋ฐ›์œผ๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผํ•ด๋ฅผ ์ž…ํž ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ํŽธ์˜๋ณด๋‹ค ์ •๋ณด๋ฅผ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€

Refresh Token์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค


JWT ๊ตฌ์กฐ

image

  1. Header

    Header๋Š” ์ด๊ฒƒ์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ํ† ํฐ์ธ์ง€ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ Signํ• ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    JSON Web Token์ด๋ฏ€๋กœ JSON ํฌ๋งท ํ˜•ํƒœ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค

    1
    2
    3
    4
    
     {
       "alg": "HS256",
       "typ": "JWT"
     }
    

    ์ด JSON ๊ฐ์ฒด๋ฅผ base64 ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด JWT์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

  2. Payload

    Payload์—๋Š” ์„œ๋ฒ„์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์–ด๋–ค ์ •๋ณด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๋‹ด์„ ์ˆ˜๋„ ์žˆ๊ณ , ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„ ๋“ฑ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Payload๋Š” ๋‹ค์Œ์œผ๋กœ ์„ค๋ช…ํ•  Signature๋ฅผ ํ†ตํ•ด ์œ ํšจ์„ฑ์ด ๊ฒ€์ฆ๋  ์ •๋ณด์ด๊ธด ํ•˜์ง€๋งŒ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋‹ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    1
    2
    3
    4
    5
    
     {
       "sub": "someInformation",
       "name": "phillip",
       "iat": 151623391
     }
    

    ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์œ„ JSON ๊ฐ์ฒด๋ฅผ base64๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด JWT์˜ ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

  3. Signature

    base64๋กœ ์ธ์ฝ”๋”ฉ ๋œ ์ฒซ ๋ฒˆ์งธ, ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์ด ์™„์„ฑ๋˜์—ˆ๋‹ค๋ฉด,

    Signature์—์„œ๋Š” ์›ํ•˜๋Š” ๋น„๋ฐ€ ํ‚ค(Secret Key)์™€ Header์—์„œ ์ง€์ •ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ

    Header์™€ Payload์— ๋Œ€ํ•ด์„œ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋ ‡๊ฒŒ ์•”ํ˜ธํ™”๋œ ๋ฉ”์‹œ์ง€๋Š” ํ† ํฐ์˜ ์œ„๋ณ€์กฐ ์œ ๋ฌด๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ HMAC SHA256 ์•Œ๊ณ ๋ฆฌ์ฆ˜(์•”ํ˜ธํ™” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜)์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด

    Signature๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.


JWT๋ฅผ ํ†ตํ•œ ์ธ์ฆ์˜ ์žฅ์ 

  1. ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ (Stateless),

    ํ™•์žฅ์— ์šฉ์ดํ•œ(Scalable) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

    • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

      (ํ† ํฐ์ด ์ •์ƒ์ ์œผ๋กœ ๊ฒ€์ฆ๋˜๋Š”์ง€๋งŒ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค)

    • ํด๋ผ์ด์–ธํŠธ๋Š” request๋ฅผ ์ „์†กํ•  ๋•Œ๋งˆ๋‹ค ํ† ํฐ์„ ํ—ค๋”์— ํฌํ•จ์‹œํ‚ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

      • ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•œ ์„œ๋น„์Šค๋ผ๋ฉด ํ•˜๋‚˜์˜ ํ† ํฐ์œผ๋กœ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ์ธ์ฆ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— JWT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

        ๋งŒ์•ฝ์— ์„ธ์…˜ ๋ฐฉ์‹์ด๋ผ๋ฉด ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ request๋ฅผ ์ „์†กํ•  ๋•Œ๋งˆ๋‹ค ์ž๊ฒฉ ์ฆ๋ช… ์ •๋ณด๋ฅผ ์ „์†กํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
    • HTTP Basic ๊ฐ™์€ ์ธ์ฆ ๋ฐฉ์‹์€ request๋ฅผ ์ „์†กํ•  ๋•Œ๋งˆ๋‹ค ์ž๊ฒฉ ์ฆ๋ช… ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์•ผ ํ•˜์ง€๋งŒ

      JWT์˜ ๊ฒฝ์šฐ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ํ•œ ๋ฒˆ์˜ ์ธ์ฆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  3. ์ธ์ฆ์„ ๋‹ด๋‹นํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ ์ฆ๋ช… ์ •๋ณด๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ ,

      Github, Google ๋“ฑ์˜ ๋‹ค๋ฅธ ํ”Œ๋žซํผ์˜ ์ž๊ฒฉ ์ฆ๋ช… ์ •๋ณด๋กœ ์ธ์ฆํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

    • ํ† ํฐ ์ƒ์„ฑ์šฉ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํšŒ์‚ฌ์—์„œ ํ† ํฐ ๊ด€๋ จ ์ž‘์—…์„ ๋งก๊ธฐ๋Š” ๊ฒƒ ๋“ฑ

      ๋‹ค์–‘ํ•œ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ถŒํ•œ ๋ถ€์—ฌ์— ์šฉ์ดํ•˜๋‹ค
    • ํ† ํฐ์˜ Payload(๋‚ด์šฉ๋ฌผ) ์•ˆ์— ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

JWT๋ฅผ ํ†ตํ•œ ์ธ์ฆ์˜ ๋‹จ์ 

  1. Payload๋Š” ๋””์ฝ”๋”ฉ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
    • Payload๋Š” base64๋กœ ์ธ์ฝ”๋”ฉ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ† ํฐ์„ ํƒˆ์ทจํ•˜์—ฌ Payload๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋ฉด

      ํ† ํฐ ์ƒ์„ฑ ์‹œ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      ๋”ฐ๋ผ์„œ Payload์—๋Š” ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ๋„คํŠธ์›Œํฌ์— ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ† ํฐ์— ์ €์žฅํ•˜๋Š” ์ •๋ณด์˜ ์–‘์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ํ† ํฐ์˜ ๊ธธ์ด๋Š” ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.

      ๋”ฐ๋ผ์„œ request๋ฅผ ์ „์†กํ•  ๋•Œ๋งˆ๋‹ค ๊ธธ์ด๊ฐ€ ๊ธด ํ† ํฐ์„ ํ•จ๊ป˜ ์ „์†กํ•˜๋ฉด ๋„คํŠธ์›Œํฌ์— ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ํ† ํฐ์€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ฆ‰ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋œ ํ† ํฐ์€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋˜ํ•œ ํ† ํฐ์ด ํƒˆ์ทจ๋œ ๊ฒฝ์šฐ ํ† ํฐ์˜ ๊ธฐํ•œ์ด ๋งŒ๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ† ํฐ ํƒˆ์ทจ์ž๊ฐ€ ํ•ด๋‹น ํ† ํฐ์„ ์ •์ƒ์ ์œผ๋กœ

      ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๋„ˆ๋ฌด ๊ธธ๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.