Search
๐Ÿ“จ

JWT (1)

ํƒœ๊ทธ
backend study

Session

โ€ข
์žฅ์ 
โ—ฆ
JSESSIONID๋Š” ์œ ์˜๋ฏธํ•œ ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ฐพ๋Š” KEY๋กœ๋งŒ ํ™œ์šฉ
โ—ฆ
ํƒˆ์ทจ๋˜์—ˆ๋‹ค๊ณ  ํ•ด์„œ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ํƒˆ์ทจ๋œ๊ฑด ์•„๋‹˜
โ€ข
๋‹จ์ 
โ—ฆ
์„œ๋ฒ„์— ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ณต๊ฐ„์ด ํ•„์š”
โ—ฆ
์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ๋‹ค๋ฉด ์ €์žฅํ•  ๊ณต๊ฐ„๋„ ๋” ๋งŽ์ด ํ•„์š”
โ—ฆ
๋ถ„์‚ฐ ์„œ๋ฒ„์—์„œ๋Š” ์„ธ์…˜์„ ๊ณต์œ ํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์Œ

Token

โ€ข
์„ธ์…˜์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ† ํฐ์œผ๋กœ ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ
โ€ข
์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ํ† ํฐ์„ ์ƒ์„ฑํ•œ ๋’ค์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ (stateless) ํ† ํฐ ๊ฐ’์„ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค
โ€ข
์ด ํ† ํฐ ๊ฐ’์„ ์œ ์ €๊ฐ€ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ์š”์ฒญ์„ ํ•  ๋•Œ ํ•จ๊ป˜ ๋ณด๋‚ด๊ณ  ์„œ๋ฒ„2(์„œ๋ฒ„1์ด์—ฌ๋„ ์ƒ๊ด€์—†์Œ)์—์„œ ์ด ํ† ๊ทผ์„ ์˜๋ฏธ์žˆ๋Š” ๊ฐ’์œผ๋กœ ํ•ด์„, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ใ„ฑ๋ฐง์„ ํ† ๋Œ€๋กœ ์œ ์ €๋ฅผ ์ธ์ฆ
์ด์ฒ˜๋Ÿผ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์„ธ์…˜ ๋ฐฉ์‹์—์„œ์˜ JSESSIONID๋Š” key๋กœ๋งŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์˜๋ฏธ์—†๋Š” ๊ฐ’์ด ๋“ค์–ด์žˆ์ง€๋งŒ ํ† ํฐ์€ ์œ ์ €๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ(ex userID)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ
โ€ข
์žฅ์ 
โ—ฆ
์„ธ์…˜๊ด€๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ๋ณ„๋„์˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
โ—ฆ
๋กœ๊ทธ์ธ์„ ์ œ๊ณตํ•œ ์„œ๋ฒ„ ๋ง๊ณ ๋„ ์„œ๋ฒ„ ๋ถ„์‚ฐ &ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ๊ณผ ๊ฐ™์€ ํ™•์žฅ์„ฑ์— ์ข‹์Œ
โ€ข
๋‹จ์ 
โ—ฆ
ํ•œ๋ฒˆ ์ œ๊ณต๋œ ํ† ํฐ์€ ํšŒ์ˆ˜๊ฐ€ ์–ด๋ ค์›€
โ–ช
์„ธ์…˜์˜ ๊ฒฝ์šฐ์—๋Š” ์„œ๋ฒ„์—์„œ ์„ธ์…˜์„ ์‚ญ์ œํ•ด๋ฒ„๋ฆฌ๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ JSESSIONID๋Š” ๋ฌด์šฉ์ง€๋ฌผ์ด ๋˜์–ด๋ฒ„๋ฆผ
โ–ช
๊ทธ๋Ÿฌ๋‚˜ ํ† ํฐ์€ ์„ธ์…˜์„ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ ์ œ๊ณต๋œ ํ† ํฐ์„ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์—†์Œ
โ–ช
๊ทธ๋ž˜์„œ ๋ณดํ†ต ํ† ํฐ์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ํ•จ(๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ๋Š” ๊ธธ๊ฒŒ ํ•จ why? โ†’ ์งง๊ฒŒ ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ† ํฐ์„ ์ž์ฃผ ๋ฐœ๊ธ‰ ๋ฐ›์•„์•ผ๋จ)
โ—ฆ
ํ† ํฐ์—๋Š” ์œ ์ €์˜ ์ •๋ณด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ์•ˆ์ •์„ฑ์ด ์šฐ๋ ค๋จ
โ–ช
๋ฏผ๊ฐ์ •๋ณด๋ฅผ ํ† ํฐ์— ํฌํ•จ์‹œํ‚ค๋ฉด ์•ˆ๋จ(ex ํŒจ์Šค์›Œ๋“œ, ๊ฐœ์ธ์ •๋ณด)

JWT์˜ ๊ตฌ์กฐ

ํ† ํฐ ๋ฐฉ์‹์—์„œ ๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ง„ JWT๊ฐ€ ์žˆ์Œ, Json Web Token์˜ ์ค„์ž„๋ง
HEADER.PAYLOAD.SIGNATURE
1.
HEADER
Header๋Š” JWT๋ฅผ ๊ฒ€์ฆํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด
Signature์— ์‚ฌ์šฉํ•  ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฌด์—‡์ธ์ง€, ํ† ํฐ ํƒ€์ž…, key์˜ ID๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ
์ด ์ •๋ณด๋ฅผ Json์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ UTF-8๋กœ ์ธ์ฝ”๋”ฉํ•œ ๋’ค Base64 URL-Sage๋กœ ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ์Œ
๊ฒฐ๊ณผ ๊ฐ’์ด ๋‚œํ•ดํ•œ ๋ฌธ์ž๋กœ ๋ณด์ด์ง€๋งŒ ์•”ํ˜ธํ™”๋œ ๊ฐ’์€ ์•„๋‹˜.
2.
PAYLOAD
์‹ค์งˆ์ ์œผ๋กœ ์ธ์ฆ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
๋ฐ์ดํ„ฐ์˜ ๊ฐ๊ฐ ํ•„๋“œ๋“ค์˜ Claim์ด๋ผ๊ณ  ํ•จ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— Claim์— username์„ ํฌํ•จํ•จ
์ธ์ฆํ•  ๋•Œ payload์— ์žˆ๋Š” username์„ ๊ฐ€์ ธ์™€์„œ ์œ ์ € ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ
๋˜ํ•œ ํ† ํฐ ๋ฐœํ–‰์‹œ๊ฐ„(iat)์™€ ๋งŒ๋ฃŒ์‹œ๊ฐ„(exp)๋ฅผ ํฌํ•จํ•จ
๊ทธ ์™ธ์—๋„ ์›ํ•˜๋Š” Claim์„ ์–ผ๋งˆ๋“ ์ง€ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฏผ๊ฐ์ •๋ณด๋Š” ํฌํ•จ์‹œ์ผœ์„œ๋Š” ์•ˆ๋จ
Payload ์—ญ์‹œ Header์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์Œ
Json์œผ๋กœ ๋ฐ”๊พผ๋’ค UTF-8๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ณ  Base64๋กœ ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ์ผ ๋ฟ
3.
SIGNATURE
์•ž์„  Header์™€ Payload๋Š” ์•”ํ˜ธํ™”ํ•˜์ง€ ์•Š๊ณ  ๋ณ€ํ™˜ํ•œ ๋ฐ์ดํ„ฐ
์ด๋ ‡๊ฒŒ Header์™€ Payload ์ƒ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋„ˆ๋ฌด ์‰ฝ๊ณ  ๋ˆ„๊ตฌ๋‚˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ
๋”ฐ๋ผ์„œ ์ € ๋‘ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์žˆ๋‹ค๋ฉด ํ† ํฐ์— ๋Œ€ํ•œ ์ง„์œ„ ์—ฌ๋ถ€ ํŒ๋‹จ์€ ์ „ํ˜€ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์—†์Œ
๊ทธ๋ž˜์„œ JWT์˜ ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” Signature๋Š” ํ† ํฐ ์ž์ฒด์˜ ์ง„์œ„์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•จ.
Signature๋Š” Header์™€ Payload๋ฅผ ํ•ฉ์นœ๋’ค ๋น„๋ฐ€ํ‚ค๋กœ Hash๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•จ
โ†’ ํ—ค๋”.ํŽ˜์ด๋กœ๋“œ ๊ฐ’์„ SecretKey๋กœ Hashingํ•˜๊ณ  Base64๋กœ ๋ณ€๊ฒฝํ•จ

Key Rolling

JWT์˜ ํ† ํฐ ์ƒ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ณด๋‹ค๋ณด๋ฉด Secret Key๊ฐ€ ๋…ธ์ถœ๋˜๋ฉด ์‚ฌ์‹ค์ƒ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ Secret Key๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋‘๊ณ  Key ๋…ธ์ถœ์— ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ์Œ
Secret Key๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜์‹œ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•ด์ค˜์„œ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด
Secret Key ์ค‘์— 1๊ฐœ๊ฐ€ ๋…ธ์ถœ๋˜์–ด๋„ ๋‹ค๋ฅธ Secret Key์™€ ๋ฐ์ดํ„ฐ๋Š” ์•ˆ์ „ํ•œ ์ƒํƒœ๊ฐ€ ๋จ
์ด๊ฑธ ๋ฐ”๋กœ Key Rolling์ด๋ผ๊ณ  ํ•จ(Key Rolling์ด ํ•„์ˆ˜๋Š” ์•„๋‹˜)
Key Rolling์—์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ Secret Key๊ฐ€ ์กด์žฌ ํ•จ
Secret Key 1๊ฐœ์— Uniqueํ•œ ID๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ ๋‘๋ฉด JWT ํ† ํฐ์„ ๋งŒ๋“ค ๋•Œ ํ—ค๋”์— kid๋ฅผ ํฌํ•จํ•˜์—ฌ ์ œ๊ณตํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ํ† ํฐ์„ ํ•ด์„คํ•  ๋•Œ kid๋กœ Secret Key๋ฅผ ์ฐพ์•„์„œ Signature๋ฅผ ๊ฒ€์ฆํ•จ

JWT Util ๋งŒ๋“ค๊ธฐ

1.
์˜์กด์„ฑ ์ถ”๊ฐ€
2.
JwtKey: JWT Secret Key๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค, Key Rolling์„ ์ง€์›ํ•จ
3.
JwtUtils: JWT ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ Parsingํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•จ
4.
SigningKeyResolver: JWT์˜ ํ—ค๋”์—์„œ kid๋ฅผ ์ฐพ์•„์„œ Key(SecretKey + ์•Œ๊ณ ๋ฆฌ์ฆ˜)๋ฅผ ์ฐพ์•„์˜ด