Jwt.md


jwtimage

๊ฐœ๋…


JSON Web Token(JWT)๋Š” ์›น ํ‘œ์ค€์œผ๋กœ์„œ JSON๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋‘ ๊ฐœ์ฒด ์‚ฌ์ด์—์„œ ๊ฐ€๋ณ๊ณ , ์ž๊ฐ€ ์ˆ˜์šฉ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.

  • ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ง€์›

  • ์ž๊ฐ€ ์ˆ˜์šฉ์ (self-contained)์ด๋‹ค. JWT๋Š” ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด(token์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ •๋ณด, ์ „๋‹ฌํ•  ์ •๋ณด, signature)๋ฅผ ์ž์ฒด์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‰ฝ๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. ์›น์˜ ๊ฒฝ์šฐ HTTP Header์— ๋„ฃ์–ด ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, URL์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋“ฑ ์‰ฝ๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ


  • ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ tokenauthimage

  • ํšŒ์› ์ธ์ฆ

    • ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ Access Token์„ ๋ฐœ๊ธ‰ํ•ด์ฃผ๊ณ  ์ด ํ›„ ์œ ์ €๋Š” ์„œ๋ฒ„์— ํ•ด๋‹น Access Token์„ ํฌํ•จํ•˜์—ฌ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ์„œ ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น token์ด ์œ ํšจํ•˜๊ณ  ์ธ์ฆ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆ์„ํ•˜๊ณ  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    • ์„œ๋ฒ„๋Š” ์œ ์ €์˜ ์„ธ์…˜์„ ๋”ฐ๋กœ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ž์›์„ ์•„๋‚„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •๋ณด ๊ต๋ฅ˜

    • ์ •๋ณด๊ฐ€ sign๋˜์žˆ์–ด์„œ ์ •๋ณด๊ฐ€ ์กฐ์ž‘๋˜์ง€ ์•Š์•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๊ฒŒ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ


jwtstructure
  • typ

    • Token์˜ type์„ ์ง€์ • (ex. JWT ๋“ฑ)

  • alg

    • ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์ • (ex. HMAC SHA256, RSA ๋“ฑ)

    • ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ† ํฐ์„ ๊ฒ€์ฆํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” signature๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉ๋จ

Payload - ์ •๋ณด

  • ์ง์ ‘์ ์ธ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.

  • ์ •๋ณด์˜ ํ•œ ์กฐ๊ฐ => ํด๋ ˆ์ž„(claim) - name:value์˜ ํ•œ ์Œ์œผ๋กœ ๊ตฌ์„ฑ

    • ํด๋ ˆ์ž„์˜ ์ข…๋ฅ˜ - ๋“ฑ๋ก๋œ(registered) ํด๋ ˆ์ž„ - ๊ณต๊ฐœ (public) ํด๋ ˆ์ž„ - ๋น„๊ณต๊ฐœ (private) ํด๋ ˆ์ž„

      ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„

      • ํ† ํฐ์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ๋‹ด๊ธฐ ์œ„ํ•ด ์ด๋ฏธ ์ •ํ•ด์ง„ ํด๋ ˆ์ž„๋“ค - iss - sub - aud - exp - nbf - iat - jti ๊ณต๊ฐœ ํด๋ ˆ์ž„

      • ์ถฉ๋Œ์ด ๋ฐฉ์ง€๋œ, URI ํ˜•์‹์˜ ํด๋ ˆ์ž„ ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„

      • ์ฟจ๋ผ์ด์–ธํŠธ <-> ์„œ๋ฒ„ ๊ฐ„์˜ ํ˜‘์˜ํ•˜์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ ˆ์ž„ ์ด๋ฆ„๋“ค

      • ์ด๋ฆ„ ์ค‘๋ณต์œผ๋กœ ์ธํ•œ ์ถฉ๋Œ ์ฃผ์˜

  • payload ์˜ˆ์ œ

"iss" : "test.com",
"exp" : "123456789000",
"https://test.com": true,
"userId": "102827465538",
"username": "test"
  • ํ•ด๋‹น payload๋ฅผ ์ธ์ฝ”๋”ฉ ํ•˜์—ฌ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

    base64๋กœ ์ธ์ฝ”๋”ฉํ•  ๊ฒฝ์šฐ =๋ฌธ์ž๊ฐ€ ๋ถ™์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ base64์ธ์ฝ”๋”ฉ์˜ padding๋ฌธ์ž๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๋Š” url-safeํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•ด๋„ ๋””์ฝ”๋”ฉ ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ๊ผญ ์ „๋ถ€ ์ง€์›Œ ์ฃผ์„ธ์š”

Signature - ์„œ๋ช…

header์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’๊ณผ payload์˜ ์ธ์ฝ”๋”ฉ ๊ฐ’์„ ํ•ฉ์นœ ํ›„ secret key๋กœ ํ•ด์‰ฌํ•˜์—ฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ ๊ณผ์ •

    • header์™€ payload์„ ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’ ์‚ฌ์ด์— .์„ ๋„ฃ์–ด์ฃผ๊ณ  ํ•ฉ์นฉ๋‹ˆ๋‹ค.

    • ํ•ฉ์นœ ๊ฐ’์„ ํ•ด์‰ฌํ•ฉ๋‹ˆ๋‹ค.

    • signature ์™„์„ฑ!

  • ์ด๋ ‡๊ฒŒ signature๊นŒ์ง€ ๋งŒ๋“  ํ›„์—๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๊ตฌํ•œ ๊ฐ’๋“ค์„ . ์ค‘๊ฐ„์ž๋กœ ๋‹ค ํ•ฉ์ณ์ฃผ๋ฉด ํ•˜๋‚˜์˜ jwt ํ† ํฐ์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค. ex) eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ2ZWxvcGVydC5jb20iLCJleHAiOiIxNDg1MjcwMDAwMDAwIiwiaHR0cHM6Ly92ZWxvcGVydC5jb20vand0X2NsYWltcy9pc19hZG1pbiI6dHJ1ZSwidXNlcklkIjoiMTEwMjgzNzM3MjcxMDIiLCJ1c2VybmFtZSI6InZlbG9wZXJ0In0.WE5fMufM0NDSVGJ8cAolXGkyB5RmYwCto1pQwDIqo2w

Last updated