ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Server] JWT๋ž€?
    ๐Ÿ’ปProgramming/Server 2023. 10. 2. 10:00

    JWT๋ž€? 

    Json Web Token์˜ ์ค€๋ง๋กœ, ๊ทธ๋Œ€๋กœ ํ•ด์„ํ•˜๋ฉด Jsonํ˜•์‹์œผ๋กœ๋œ ์›น ํ† ํฐ์ด๋ผ๋Š” ๋ง์ด๋‹ค. ์ •๋ณด๋ฅผ ๋น„๋ฐ€๋ฆฌ์— ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ธ์ฆํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

    ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ํ†ต์‹ ํ•  ๋•Œ ๊ถŒํ•œ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์ด๋‹ค. 

    JWT๋Š” ํ† ํฐ ์ž์ฒด์— ์ •๋ณด๋ฅผ ๋‹ด๋Š” Self-Contained ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. Jsonํ˜•ํƒœ๋กœ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ ํ‘œ์ค€ ๊ทœ์•ฝ์— ๋”ฐ๋ผ ์ƒ์„ฑํ•œ ์•”ํ˜ธํ™”๋œ ํ† ํฐ์œผ๋กœ ๋ณต์žกํ•˜๊ณ  ์ฝ์„ ์ˆ˜ ์—†๋Š” String ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. 

     

    JWT์˜ ๊ตฌ์„ฑ์š”์†Œ

    JWT๋Š” ํ—ค๋”(header), ํŽ˜์ด๋กœ๋“œ(paylod), ์„œ๋ช…(signature) ์„ธ ํŒŒํŠธ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ์œผ๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. JSON ํ˜•ํƒœ์ธ ๊ฐ ๋ถ€๋ถ„์€ Base64Url๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด ํ‘œํ˜„๋œ๋‹ค.

    *Base64Url์€ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ ๊ฐ™์€ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ํ•ญ์ƒ ๊ฐ™์€ ์ธ์ฝ”๋”ฉ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

    ํ—ค๋”(Header)

    ํ† ํฐ์˜ ํ—ค๋”๋Š” ๋‘๊ฐ€์ง€ ์ •๋ณด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. alg๋Š” ํ—ค๋”๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, Signature๋ฅผ ํ•ด์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ.

    { 
       "alg": "HS256",
       "typ": JWT
     }

    typ: ํ† ํฐ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ค€๋‹ค.(ex. JWT)

    alg: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฉ์‹์„ ์ง€์ •ํ•ด์ฃผ๊ณ , ์„œ๋ช… ๋ฐ ํ† ํฐ ๊ฒ€์ฆ์— ์‚ฌ์šฉ๋œ๋‹ค.

     

    ํŽ˜์ด๋กœ๋“œ(Payload)

    ํ† ํฐ์—์„œ ์‚ฌ์šฉํ•  ์ •๋ณด์˜ ์กฐ๊ฐ๋“ค์ธ ํด๋ ˆ์ž„(Claim)์ด ๋‹ด๊ฒจ์žˆ๋‹ค. ์ „๋‹ฌํ•˜๋ ค๋Š” ์ •๋ณด(์‚ฌ์šฉ์ž id๋ผ๋˜๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋“ค..=ํด๋ ˆ์ž„)

    payload์˜ ๋‚ด์šฉ์€ "์ˆ˜์ •"์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋…ธ์ถœ๊ณผ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•œ ์ง€์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด(ex. ํ† ํฐ์˜ ๊ถŒํ•œ์˜ ๋ฒ”์œ„, ํ† ํฐ์˜ ๋ฐœ๊ธ‰์ผ์ด๋‚˜ ๋งŒ๋ฃŒ์ผ)๋งŒ ๋‹ด์•„์•ผํ•œ๋‹ค.

     

    ์„œ๋ช…(Signature)

    ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์œผ๋กœ ํ—ค๋”์™€ ์ •๋ณด๋ฅผ ํ•ฉ์นœ ํ›„ ๋ฐœ๊ธ‰ํ•ด์ค€ ์„œ๋ฒ„๊ฐ€ ์ง€์ •ํ•œ ์‹œํฌ๋ฆฟ ํ‚ค๋กœ ์•”ํ˜ธํ™”์‹œ์ผœ ํ† ํฐ์„ "๋ณ€์กฐ"ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. ํ† ํฐ์„ ์ธ์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ ํ•œ ์•”ํ˜ธํ™” ์ฝ”๋“œ์ด๋‹ค. ์„œ๋ช…์€ ์œ„์—์„œ ๋งŒ๋“  ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ์˜ ๊ฐ’์„ ๊ฐ๊ฐ Base64Url๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ณ , ์ธ์ฝ”๋”ฉํ•œ ๋น„๋ฐ€ ํ‚ค๋ฅผ ์ด์šฉ์— ํ—ค๋”์—์„œ ์ •์˜ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹ฑ์„ ํ•˜๊ณ , ์ด ๊ฐ’์„ ๋‹ค์‹œ Base64Url๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

     

    JWT์˜ ๋‹จ์ 

    Self-contained: ํ† ํฐ ์ž์ฒด์— ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์–‘๋‚ ์˜ ๊ฒ€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

    ํ† ํฐ ๊ธธ์ด: ํŽ˜์ด๋กœ๋“œ์— 3์ข…๋ฅ˜์˜ ํด๋ ˆ์ž„์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ณด๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํ† ํฐ์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜์„œ ๋„คํŠธ์›Œํฌ์— ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

    Stateless: JWT๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด์ง€๋ฉด ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ† ํฐ์„ ์ž„์˜๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๊ผญ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

    Store Token: ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ† ํฐ์„ ์ €์žฅํ•ด์•ผํ•œ๋‹ค.

Designed by Tistory.