JWT(JSON Web Tokens)์ด๋ž€?

  • ๋‘ ๊ฐœ์ฒด์—์„œ JSON ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋ณ๊ณ  ์ •๋ณด๋ฅผ ์•ˆ์ „์„ฑ ์žˆ๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
  • https://tools.ietf.org/html/rfc7519

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

header.payload.signature

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ token ํƒ€์ž…์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
{
  "alg": "HS256",
  "typ": "JWT"
}

Claim(payload)

  • ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ๊ณต๊ฐ„์ด๋‹ค.
  • ์ถ”๊ฐ€์ ์œผ๋กœ JWT์— ์˜ˆ์•ฝ๋œ ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋‹ค.
    • ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋”ฐ๋ผ ์˜ˆ์•ฝ์–ด๋ฅผ ์ง€์›ํ• ์ˆ˜๋„ ์•ˆํ• ์ˆ˜๋„ ์žˆ๋‹ค.
    • iss: ํ† ํฐ ๋ฐœ๊ธ‰์ž
    • sub: ํ† ํฐ ์ œ๋ชฉ
    • aud: ํ† ํฐ ๋Œ€์ƒ์ž
    • exp: ํ† ํฐ์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„
    • nbf: Not Before
    • iat: ํ† ํฐ์ด ๋ฐœ๊ธ‰๋œ ์‹œ๊ฐ„
    • jti: JWT์˜ ๊ณ ์œ  ์‹๋ณ„์ž
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

signature

  • ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ signature hash๊ฐ’
  • header์™€ payload ๊ทธ๋ฆฌ๊ณ  secret key์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ์ •ํ•ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ hashingํ•œ ๊ฐ’

JWT ์ธ์ฆ ์ ˆ์ฐจ๋Š”?

  • ์‚ฌ์šฉ์ž๊ฐ€ id์™€ password๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ์‹œ๋„
  • ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ํ™•์ธํ•˜๊ณ  secret key๋ฅผ ํ†ตํ•ด Access token์„ ๋ฐœ๊ธ‰
  • ์ธ์ฆ ์ดํ›„ ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ์š”์ฒญํ•  ๋•Œ Authorization header์— Access token์„ ๋‹ด์•„์„œ ์š”์ฒญ
  • ์„œ๋ฒ„๋Š” JWT Signature๋ฅผ ์ฒดํฌํ•˜๊ณ  Payload๋กœ๋ถ€ํ„ฐ user ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์›ํ•˜๋Š” ์ž์›์„ Return

โ€‹ โ€‹

์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ์—†์„๊นŒ?

  • JWT๋Š” ์•ˆ์ „ํ•œ HttpOnly ์ฟ ํ‚ค๋กœ ์ €์žฅ
    • Cross-Site Scripting(XSS) ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€
  • ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋Š” JWT๋กœ ์ €์žฅํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
    • ์‰ฝ๊ฒŒ Debug๊ฐ€๋Šฅ

Springboot - JWT Example

Reference