๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

Spring Security ์ ์šฉ๊ธฐ (3) JWT(JSON Web Tokens) ๊ฐœ๋… ๋ณธ๋ฌธ

Study/Java

Spring Security ์ ์šฉ๊ธฐ (3) JWT(JSON Web Tokens) ๊ฐœ๋…

Shinjio 2024. 4. 29. 22:00

์ด์ „ ์‹œ๊ฐ„์—๋Š” Spring Security๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ป๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. 

ํ•„์ž๋Š” ๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ jwt๋ฅผ ํ™œ์šฉํ•œ ์ธ์ฆ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค. 

jwt ์„ค์ •์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— jwt๋ž€ ๋ฌด์—‡์ธ์ง€ ๋จผ์ € ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค. 

 


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

JWT(JSON Web Token)์€  ์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ JSON ํ† ํฐ์„ ์˜๋ฏธํ•œ๋‹ค.

JWT๋Š” HMAC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€ํ‚ค๋กœ ์„œ๋ช…ํ•˜๊ฑฐ๋‚˜ RSA ๋˜๋Š” ECDSA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๊ฐœ/๊ฐœ์ธํ‚ค ์Œ์„ ์‚ฌ์šฉํ•ด ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

HMAC ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์ด์ „์— OTP  ๊ด€๋ จ ํฌ์ŠคํŒ…์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

https://danyoujeong.tistory.com/223

 

OTP์˜ ๋™์ž‘ ์›๋ฆฌ, HOTP์™€ TOTP ์ดํ•ดํ•˜๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ ๊ธˆ์œต ๊ฑฐ๋ž˜์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ๋กœ๊ทธ์ธ 2์ฐจ ์ธ์ฆ์œผ๋กœ๋„ ์ž์ฃผ ์“ฐ์ด๋Š” OTP์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. OTP๋ž€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ณ , OTP์˜ ์ข…๋ฅ˜์ธ HOTP์™€ TOTP๊ฐ€ ์–ด๋– ํ•œ ์›

danyoujeong.tistory.com


JWT์˜ ํ™œ์šฉ

JWT๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. 

 

1. ์ธ์ฆ(Authorization)

2. ์ •๋ณด๊ตํ™˜(Information Exchange)

 

1๋ฒˆ์˜ ์ธ์ฆ(Authorization)์€ JWT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์ด๋‹ค. 

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ํ›„ ๊ฐ ํ›„์† ์š”์ฒญ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ฃผ๋ฌธ/๊ฒฐ์ œ ๋“ฑ์˜ ์š”์ฒญ ํ—ค๋”์— JWT๊ฐ€ ํฌํ•จ๋˜์–ด ํ•ด๋‹น ํ† ํฐ์œผ๋กœ ํ—ˆ์šฉ๋œ ๊ฒฝ๋กœ, ์„œ๋น„์Šค์— ์—‘์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

2๋ฒˆ์˜ ์ •๋ณด๊ตํ™˜์€ ๊ด€๊ณ„์ž ๊ฐ„ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. 

JWT๋Š” ์œ„์˜ ์ •์˜์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ณต๊ฐœ/๊ฐœ์ธํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค. 


JWT ๊ตฌ์กฐ

JWT ๋Š” ( . )์„ ๊ธฐ์ค€์œผ๋กœ 3 ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค. 

1. Header

2. Payload

3. Signature

 

xxxxx.yyyyy.zzzzz

 

Header

Header์—๋Š” 2๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. 

์ฒซ๋ฒˆ์งธ๋Š” JWT์™€ ๊ฐ™์€ token์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ , ๋‘๋ฒˆ์งธ๋Š” HMAC, SHA256, RSA์™€ ๊ฐ™์€ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ช…์‹œํ•œ๋‹ค.

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

 

๊ทธ๋ฆฌ๊ณ  ์ด JSON์€ Base64Url ์ธ์ฝ”๋”ฉ๋˜์–ด JWT์˜ ์ฒซ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ํ˜•์„ฑํ•œ๋‹ค. 

 

Base64Url ์ธ์ฝ”๋”ฉ
URL์—์„œ ์•ˆ์ „ํ•œ ๋ฌธ์ž ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•
์ผ๋ฐ˜์ ์ธ Base64  ์ธ์ฝ”๋”ฉ์—์„œ๋Š” '+', '/'์™€ ๊ฐ™์€ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด๋Š” URL์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. 
๋”ฐ๋ผ์„œ '+'๋Š” '-'๋กœ, '/'๋Š” '_'๋กœ ๋Œ€์ฒดํ•˜๊ณ , '='์„ ์ƒ๋žตํ•˜์—ฌ URL์—์„œ ์•ˆ์ „ํ•œ ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. 

 

Payload

Payload๋Š” ํด๋ ˆ์ž„์„ ํฌํ•จํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ํด๋ ˆ์ž„(Claim)์€ ์ด๋ฆ„, ๋“ฑ๊ธ‰๊ณผ ๊ฐ™์€ ๊ฐœ์ฒด(์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž)์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งํ•œ๋‹ค. 

ํด๋ ˆ์ž„์€ 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. 

 

1. ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„ : ์˜๋ฌด์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์œ ์šฉํ•˜๊ณ  ์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•œ ํด๋ ˆ์ž„ ์ง‘ํ•ฉ. ๋ฐœํ–‰์ž(iss), ๋งŒ๋ฃŒ ์‹œ๊ฐ„(exp), ์ฃผ์ฒด(sub) ๋“ฑ์„ ์˜๋ฏธํ•œ๋‹ค. ํด๋ ˆ์ž„ ์ด๋ฆ„์€ JWT๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋˜๋„๋ก ์„ธ ๊ธ€์ž๋กœ๋งŒ ๋˜์–ด ์žˆ๋‹ค.  

2. ๊ณต๊ฐœ ํด๋ ˆ์ž„ : JWT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ž์œ ๋กญ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ ˆ์ž„์ด๋‹ค. 

3. ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„ : ์‚ฌ์šฉ์ž๋“ค์ด ์‚ฌ์šฉ์— ๋™์˜ํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์‚ฌ์šฉ์ž ์ •์˜ ํด๋ ˆ์ž„์ด๋‹ค. 

 

{
	"sub": "1234567890",
	"name": "John Doe",
	"admin": true
}

 

 

ํŽ˜์ด๋กœ๋“œ๋Š” Base64Url ์ธ์ฝ”๋”ฉ๋˜์–ด JSON Web Token์˜ ๋‘๋ฒˆ์งธ ๋ถ€๋ถ„์„ ํ˜•์„ฑํ•œ๋‹ค.

์„œ๋ช…๋œ ํ† ํฐ์˜ ๊ฒฝ์šฐ ํŽ˜์ด๋กœ๋“œ์˜ ์ •๋ณด๋Š” ๋ณ€์กฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋„๋ก ๋ณดํ˜ธ๋˜์ง€๋งŒ ๋ˆ„๊ตฌ๋‚˜ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ ํŽ˜์ด๋กœ๋“œ๋‚˜ ํ—ค๋” ์š”์†Œ์— ๋น„๋ฐ€ ์ •๋ณด ํ˜น์€ ์•”ํ˜ธํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

 

Signature

์„œ๋ช… ๋ถ€๋ถ„์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์ฝ”๋”ฉ๋œ ํ—ค๋”, ์ธ์ฝ”๋”ฉ๋œ ํŽ˜์ด๋กœ๋“œ, ํ—ค๋”์—์„œ ์ง€์ •๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค. ๊ทธ ํ›„ ์ด๋ฅผ ์„œ๋ช…ํ•œ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด HMAC SHA256  ์•Œ๋กœ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์„œ๋ช…์ด ์ƒ์„ฑ๋œ๋‹ค. 

HMACSHA256(
	base64UrlEncode(header) + "." +
	base64UrlEncode(payload),
	secret
)

 

์„œ๋ช…(Signature)๋Š” ํ•ด๋‹น ๋ฉ”์‹œ์ง€๊ฐ€ ์ค‘๊ฐ„์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ(๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ)์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋น„๊ณต๊ฐœํ‚ค๋กœ ์„œ๋ช…๋œ ํ† ํฐ์˜ ๊ฒฝ์šฐ JWT์˜ ๋ฐœ์‹ ์ž๊ฐ€ ์ž์‹ ์ด ๋งํ•œ๋Œ€๋กœ์ž„์„ ๊ฒ€์ฆํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

 

์•„๋ž˜์˜ ์‚ฌ์ง„์€ JWT ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. 

์ฒซ๋ฒˆ์งธ์ค„์€ ํ—ค๋”๋ฅผ Base64Url ์ธ์ฝ”๋”ฉํ•œ ๋ถ€๋ถ„์ด๋ฉฐ,

๋‘๋ฒˆ์งธ, ์„ธ๋ฒˆ์งธ ์ค„์€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ธ์ฝ”๋”ฉํ•œ ๋ถ€๋ถ„,

๋งˆ์ง€๋ง‰์ค„์€ ์•„๋ž˜ HMACSHA256๊ณผ ๊ฐ™์ด ์„œ๋ช…๋œ ๋ถ€๋ถ„์ด๋‹ค. 

HMACSHA256(
	base64UrlEncode(header) + "." +
	base64UrlEncode(payload),
	secret
)

JWT ์ž‘๋™ ๋ฐฉ์‹

์ธ์ฆ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž๊ฒฉ์ฆ๋ช…์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋ฉด JSON Web Token์ด ๋ฐ˜ํ™˜๋œ๋‹ค. 

์‚ฌ์šฉ์ž๊ฐ€ ๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ ํ˜น์€ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๋Š” ๊ฒฝ์šฐ Bearer ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Authorization ํ—ค๋”์— JWT๋ฅผ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. ํ—ค๋”์˜ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

Authorization: Bearer <token>

 

์„œ๋ฒ„๋Š” Authorization ํ—ค๋”์— ์œ ํšจํ•œ JWT๋ฅผ ํ™•์ธํ•˜๊ณ , ์œ ํšจํ•œ JWT๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. 

 

HTTP ํ—ค๋”๋ฅผ ํ†ตํ•ด JWT์„ ์ „์†กํ•  ๋•Œ ์ฃผ์˜ํ•  ์ ์€ ๋„ˆ๋ฌด ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ผ๋ถ€ ์„œ๋ฒ„์—์„œ๋Š” ํ—ค๋”์— 8KB ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์ˆ˜๋ฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด์™€ ๊ฐ™์ด JWT์— ๋„ˆ๋ฌด ๋งŽ์€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋˜ํ•œ, JWT๋Š” Authorization ํ—ค๋”์— ์ „์†ก๋˜๋Š” ๊ฒฝ์šฐ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ CORS ๋ฌธ์ œ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. 

 

 

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Authorization ์„œ๋ฒ„์— ์ธ๊ฐ€๋ฅผ ์š”์ฒญํ•œ๋‹ค.
  2. ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ Authorization ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์— ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ๋Š” Authorization ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ฐ›์€ ์—‘์„ธ์Šค ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค(API ๋“ฑ)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. 

JWT์˜ ์žฅ๋‹จ์ 

์žฅ์ 

1. Header์™€ Payload์˜ ๋ฐ์ดํ„ฐ๋ฅผ Secret ํ˜น์€ ๋น„๋ฐ€ํ‚ค/๊ณต๊ฐœํ‚ค๋กœ ์„œ๋ช…ํ•˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์œ„๋ณ€์กฐ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. 

2. ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค. 

3. JWT๋Š” ํ† ํฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด์™€ ์ „๋‹ฌํ•  ์ •๋ณด ๋ฐ ํ† ํฐ์ด ๊ฒ€์ฆ๋˜์—ˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” ์„œ๋ช… ๋“ฑ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค. 

4. ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์„ธ์…˜๊ณผ ๋‹ค๋ฅด๊ฒŒ ์„œ๋ฒ„๋Š” ๋ฌด์ƒํƒœ(Stateless)๊ฐ€ ๋˜์–ด ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์ด ์šฐ์ˆ˜ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. 

5. ํ† ํฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์— ์ ‘๊ทผ ๋ฐ ๊ถŒํ•œ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

6. OAuth์˜ ๊ฒฝ์šฐ Facebook, Google ๋“ฑ ์†Œ์…œ ๊ณ„์ •์„ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์›น์„œ๋น„์Šค์—์„œ๋„ ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

7. ๋ชจ๋ฐ”์ผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ์ž˜ ๋™์ž‘ํ•œ๋‹ค. (๋ชจ๋ฐ”์ผ์€ ์„ธ์…˜ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ) 

 

๋‹จ์ 

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

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

3. Payload ์ธ์ฝ”๋”ฉ : payload ์ž์ฒด๋Š” ์•”ํ˜ธํ™” ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ์ด๋ฏ€๋กœ ์ค‘๊ฐ„์— Payload๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ๋””์ฝ”๋”ฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ payload์— ์ค‘์š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ฉด ์•ˆ๋œ๋‹ค. 

4. Store Token : stateless ํŠน์ง•์„ ๊ฐ€์ง€๋ฏ€๋กœ ํ† ํฐ์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์ €์žฅํ•œ๋‹ค. ๋•Œ๋ฌธ์— ํ† ํฐ ์ž์ฒด๋ฅผ ํƒˆ์ทจ ๋‹นํ•˜๋ฉด ๋Œ€์ฒ˜ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. 


Refresh Token์˜ ํ•„์š”์„ฑ

JWT๋ฅผ ์ด์šฉํ•ด ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด OAuth ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ ์ฒด๊ณ„(์นด์นด์˜ค, ๊ตฌ๊ธ€ ๋“ฑ)์—์„œ Refresh Token์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Refresh Token์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ? ์ด๋Š” JWT์˜ ๋‹จ์ ์—์„œ ์‚ดํŽด๋ณด์•˜๋˜ Store Token ํŠน์ง•๊ณผ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค. 

 

์—‘์„ธ์Šค ํ† ํฐ์„ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด์ปค๊ฐ€ ์ด๋ฅผ ๋„์šฉํ•˜์—ฌ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—‘์„ธ์Šค ํ† ํฐ์„ ์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๋‹ค๊ณ  ์—‘์„ธ์Šค ํ† ํฐ์„ ๋„ˆ๋ฌด ์ž์ฃผ ๋ฐœํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ์„ ์ž์ฃผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถˆํŽธํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋‚˜ํƒ€๋‚œ ๊ฒƒ์ด 'Refresh Token'์ด๋‹ค. 

 

๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ์—‘์„ธ์Šค ํ† ํฐ๊ณผ ๋˜‘๊ฐ™์€ ํ˜•ํƒœ์˜ JWT์ด๋‹ค. ์ด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ์—‘์„ธ์Šค ํ† ํฐ์„ ์–ป๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. 

์—‘์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ์ปจํŠธ๋กค๋Ÿฌ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์—‘์„ธ์Šค ํ† ํฐ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์—‘์„ธ์Šค ํ† ํฐ๋ณด๋‹ค ์ˆ˜๋ช…์ด ํ›จ์”ฌ ๊ธธ๋‹ค. ๋ฐ˜๋ฉด, ์—‘์„ธ์Šค ํ† ํฐ์€ ์ˆ˜๋ช…์ด ์งง๋‹ค. 

 

 

 

1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์ธ์ฆ ์„œ๋ฒ„์—์„œ ์—‘์„ธ์Šค ํ† ํฐ๊ณผ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ DB์— ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ €์žฅํ•ด๋‘”๋‹ค. 

2. ์‚ฌ์šฉ์ž๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ์— ์ €์žฅํ•œ ํ›„, ์•ก์„ธ์Šค ํ† ํฐ์„ ํ—ค๋”์— ์‹ค์–ด ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. 

3. ์„œ๋ฒˆํŠผ ์—‘์„ธ์Šค ํ† ํฐ์„ ๊ฒ€์ฆํ•˜์—ฌ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค. 

4. ์‹œ๊ฐ„์ด ์ง€๋‚˜ ์—‘์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋œ๋‹ค. 

5. ์‚ฌ์šฉ์ž๋Š” ์ด์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ์—‘์„ธ์Šค ํ† ํฐ์„ ํ—ค๋”์— ์‹ค์–ด ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. 

6. ์„œ๋ฒ„๋Š” ์—‘์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Œ์„ ํ™•์ธํ•˜๊ณ  ๊ถŒํ•œ ์—†์Œ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ธ๋‹ค. 

7. ์‚ฌ์šฉ์ž๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ๊ณผ ์—‘์„ธ์Šค ํ† ํฐ์„ ํ•จ๊ป˜ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ๋‹ค. 

8. ์„œ๋ฒ„๋Š” ์—‘์„ธ์Šค ํ† ํฐ์ด ์กฐ์ž‘๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ ํ›„ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ๊ณผ ์‚ฌ์šฉ์ž์— DB์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋น„๊ตํ•œ๋‹ค. ํ† ํฐ์ด ๋™์ผํ•˜๊ณ  ์œ ํšจ๊ธฐ๊ฐ„๋„ ์ง€๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ƒˆ๋กœ์› ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค. 

9. ์‚ฌ์šฉ์ž๋Š” ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ์„ ํ—ค๋”์— ์‹ค์–ด ๋‹ค์‹œ API ์š”์ฒญ์„ ์ง„ํ–‰ํ•œ๋‹ค. 

 

ํ† ํฐ ๋งŒ๋ฃŒ ์œ ํ˜• 4๊ฐ€์ง€์™€ ๊ทธ์— ๋”ฐ๋ฅธ ์žฌ๋ฐœ๊ธ‰ ๋ฐฉ๋ฒ•
1. access token๊ณผ refresh token ๋ชจ๋‘ ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ 
    - ์—๋Ÿฌ ๋ฐœ์ƒ, ์žฌ๋กœ๊ทธ์ธํ•˜์—ฌ ๋‘˜ ๋‹ค ์ƒˆ๋กœ ๋ฐœ๊ธ‰
2. access token์€ ๋งŒ๋ฃŒ๋์ง€๋งŒ, refresh token์€ ์œ ํšจํ•œ ๊ฒฝ์šฐ
    - refresh token์„ ๊ฒ€์ฆํ•˜์—ฌ access token ์žฌ๋ฐœ๊ธ‰
    - DB์— ์ €์žฅ๋œ refresh token ์ •๋ณด์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ refresh token ๋น„๊ต
3. access token์€ ์œ ํšจํ•˜์ง€๋งŒ, refresh token์€ ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ
    - access token ๊ฒ€์ฆํ•˜์—ฌ refresh token ์žฌ๋ฐœ๊ธ‰
    - access token์ด ์œ ํšจํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ธ์ฆ๋œ ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ”๋กœ refresh token ์žฌ๋ฐœ๊ธ‰
4. access token๊ณผ refresh token ๋ชจ๋‘ ์œ ํšจํ•œ ๊ฒฝ์šฐ 
    - ์ •์ƒ ์ฒ˜๋ฆฌ

์ฐธ๊ณ ์ž๋ฃŒ

https://jwt.io/introduction

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC#jwt_json_web_token_%EC%9D%B4%EB%9E%80

 

๐ŸŒ JWT ํ† ํฐ ์ธ์ฆ ์ด๋ž€? (์ฟ ํ‚ค vs ์„ธ์…˜ vs ํ† ํฐ)

Cookie / Session / Token ์ธ์ฆ ๋ฐฉ์‹ ์ข…๋ฅ˜ ๋ณดํ†ต ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ 3๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ๋‹ค. JWT๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์•ž์„œ ์šฐ์„  ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ํ†ต์‹  ๋ฐฉ์‹์„ ๋ณต์Šตํ•ด

inpa.tistory.com

https://medium.com/@chauhanshubham19765/jwt-refresh-token-61823e888bc7

 

JWT Refresh Token

This article will go through an example of how to implement JWT (JSON Web Token) authentication with refresh tokens in an ASP.NET Core 5.0…

medium.com