Spring Security

[Spring Security] ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„๊ธฐ (๋กœ๊ทธ์ธ ๊ฐœ๋…, JWT) - 1

๋งŒ ์ œ 2024. 3. 18. 19:45

๐Ÿš€ ๋กœ๊ทธ์ธ์— ๋Œ€ํ•ด

โญ ๋กœ๊ทธ์ธ์ด๋ž€?

"๋กœ๊ทธ์ธ"

์›น ๊ฐœ๋ฐœ ์ž…๋ฌธํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด ๋ดค์œผ๋ฉด

ํ•œ ๋ฒˆ์ฏค์€ ๋กœ๊ทธ์ธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด ๋ดค์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

๋กœ๊ทธ์ธ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

์ ‘๊ทผ ๊ถŒํ•œ์„ ์–ป๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ์— ์ž๊ธฐ ์ž์‹ ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฆ๋ช…๊ณผ ์ ‘๊ทผ ๊ถŒํ•œ์ด๋ผ๋Š” ๋ง์ด ๋‚˜์˜จ๋‹ค.

๊ฐœ๋ฐœ์—์„œ ์ข€ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์–ด๋กœ ์น˜ํ™˜ํ•ด์„œ ๋งํ•˜์ž๋ฉด

์ฆ๋ช…์€ ์ธ์ฆ(Authentication),

์ ‘๊ทผ ๊ถŒํ•œ์€ ์ธ๊ฐ€(Authorization)๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด,

  • ๊ฒŒ์ž„ ์•ˆ์— ์žˆ๋Š” ๋‚ด ์บ๋ฆญํ„ฐ์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด์„ 
    ๊ฒŒ์ž„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ž์‹ ์ด ์บ๋ฆญํ„ฐ ์ฃผ์ธ์ž„์„ ์ธ์ฆ(์ฆ๋ช…)ํ•˜๊ณ  ์ธ๊ฐ€(์ ‘๊ทผ ๊ถŒํ•œ)๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.
  • ์‡ผํ•‘๋ชฐ์— ์ ‘์†ํ•ด ์›ํ•˜๋Š” ๋ฌผ๊ฑด์„ ์ฃผ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด์„ 
    ์‡ผํ•‘๋ชฐ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ž์‹ ์ด ์‡ผํ•‘๋ชฐ์— ๊ฐ€์ž…๋˜์–ด ์žˆ๋Š” ํŠน์ • ์ธ๋ฌผ์ž„์„ ์ธ์ฆ(์ฆ๋ช…)ํ•˜๊ณ 
    ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ž๊ฒฉ์ธ ์ธ๊ฐ€(๊ถŒํ•œ)๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

์œ„ ๊ณผ์ •์„ ์œ„ํ•ด ๋กœ๊ทธ์ธ์ด๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•œ๋‹ค.

์ธ์ฆ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋‚ด๊ฐ€ ํ•ด๋‹น ์„œ๋น„์Šค์˜ ํšŒ์›์ž„์„ ์ฆ๋ช…ํ•˜๊ณ  ์ธ๊ฐ€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ.

 

์š”์ฆ˜์€ ๋งˆ์šฐ์Šค ๋ช‡ ๋ฒˆ ํด๋ฆญ์ด๋ฉด ๋กœ๊ทธ์ธ์ด ๋˜๋Š” ์„ธ์ƒ์ด๋‹ค.

์œ ์ €์—๊ฒŒ ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฌ์šด ๋กœ๊ทธ์ธ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด

ํ™”๋ฉด ๋’คํŽธ์—์„  ๋งŽ์€ ๊ตฌํ˜„ ๊ณผ์ •๋“ค์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋‹ค.

 

๊ฐœ๋ฐœ์ž์˜ ๊ด€์ 

ํŠนํžˆ, ๋ฐฑ์—”๋“œ์˜ ๊ด€์ ์œผ๋กœ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๊ณผ์ •์„ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ๋‹ค.

 

๋กœ๊ทธ์ธ ๊ตฌํ˜„์€ ์ •๋ง ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ์ค‘ ํ˜„์žฌ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋กํ•  ์˜ˆ์ •์ธ๋ฐ

  • Spring Boot 3
  • Spring Security 6
  • JWT
  • OAuth 2.0

์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์Šคํƒ์„ ์ ์šฉํ•œ ๊ฒฝํ—˜์„ ๊ธฐ๋กํ•œ๋‹ค.

โญ Spring Security๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๋‚œ์ด๋„๋ฅผ ์ƒ๋‹นํžˆ ์˜ฌ๋ ค์ฃผ๋Š”

Spring Security๋ฅผ ๊ตณ์ด ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”

์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ .

๐Ÿ‘‰ [Spring Security] ๋ณด์•ˆ๊ณผ Spring Security

???: ์‹œํ๋ฆฌํ‹ฐ ๊ตฌํ˜„ ๋‚œ์ด๋„๋‚˜ ์‹œ๊ฐ„์ด ๋ถ€๋‹ด์ด ๋˜์–ด์„œ ๋„์ž…ํ•˜๊ธฐ ์‹ซ์–ด์š”.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ์ฆ, ์ธ๊ฐ€ ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์…”์•ผ ํ•œ๋‹ค.

๋ฌผ๋ก  Spring Security๋„ ๋ณธ์ธ ์„œ๋น„์Šค์— ๋งž๊ฒŒ ์ปค์Šคํ…€์ด ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ง์ ‘ ํ•„ํ„ฐ๋‚˜ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹จ

๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ์ธ์ฆ ํ•„ํ„ฐ ๋ฐ ๋กœ์ง ์ œ๊ณต, ๊ณต์‹ ๋ฌธ์„œ ๋ฐ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ์€ Spring Security ์‚ฌ์šฉ์ด ์ข€ ๋” ์ˆ˜์›”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ญ์‹œ ์ „์ž๋˜ ํ›„์ž๋˜ ์ด๊ฒƒ๋„ ํ•˜๊ธฐ ๋‚˜๋ฆ„.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ

๋กœ๊ทธ์ธ์„ ๋””ํ…Œ์ผํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ์‹ถ์œผ๋ฉด

์–ผ๋งˆ๋“ ์ง€ ์‹œ๊ฐ„, ๋…ธ๋ ฅ์„ ์ค„์—ฌ์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋งŒํผ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ์€ ์‹ ๋ขฐ๋„๊ฐ€ ๋–จ์–ด์ง€๋Š” ๋ฐ˜๋น„๋ก€๋ฅผ ๊ฐ€์ง„๋‹ค.

๋”ฐ๋ผ์„œ Spring Security ๋„์ž…์„ ๋ฌด์กฐ๊ฑด ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

๊ฐœ๋ฐœ์—์„œ ๋ฌด์กฐ๊ฑด์€ ์—†๊ธฐ ๋•Œ๋ฌธ์—

๋ณธ์ธ์˜ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ, ๋งˆ๊ฐ ์‹œ๊ฐ„, ์ƒํ™ฉ ๋“ฑ์— ๋”ฐ๋ผ ์œ ์—ฐํ•œ ํŒ๋‹จ์ด ํ•„์š”ํ•˜๋‹ค.

 

์ด์ „์—๋Š” ์ž˜ ๋ชจ๋ฅด๊ณ  ๋ฌด์ž‘์ • ์ผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ๋‹ค์‹œ ์ ์šฉํ•˜๋ฉด์„œ ์ œ๋Œ€๋กœ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

ํ‰์†Œ์— ๋ณด์•ˆ์„ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ธฐ๋„ ํ•˜๊ณ 

์ข€ ๋” ์•Œ๊ณ  ์จ๋ดค์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ๋งˆ์Œ์—

์šฐ์„  Spring Security 6 ์œ ๋ฃŒ ๊ฐ•์˜๋ฅผ ๋“ค์—ˆ๊ณ 

๊ณต์‹ ๋ฌธ์„œ ๋ฐ ๋‹ค์–‘ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

 

๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค ใ… 


๐Ÿš€ JWT(Json Web Token)

โญ JWT๋ž€?

์ธ์ฆ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ์•”ํ˜ธํ™”์‹œํ‚จ JSON ํ† ํฐ์ด๋‹ค.

JWT๋Š” JSON ๋ฐ์ดํ„ฐ๋ฅผ Base64 URL-safe Encode๋ฅผ ํ†ตํ•ด ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ง๋ ฌํ™”ํ•œ ๊ฒƒ์ด๊ณ ,

ํ† ํฐ ๋‚ด๋ถ€์—๋Š” ๊ฐœ์ธํ‚ค๋ฅผ ํ†ตํ•œ ์ „์ž์„œ๋ช…์ด ๋“ค์–ด์žˆ๋‹ค.

โ€ป Base64 URL-safe Encode๋ž€, ์ผ๋ฐ˜์ ์ธ Base64 Encode๋ฅผ URL์—์„œ ์˜ค๋ฅ˜ ์—†์ด ์‚ฌ์šฉํ•˜๋„๋ก
'+'์™€ '/'๋ฅผ ๊ฐ๊ฐ '-', '_'์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

 

JWT๋Š” ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

  • Header
  • Payload
  • Signature

๋งˆ์นจํ‘œ๋กœ ๊ฐ ์š”์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

์ถœ์ฒ˜: fakerdeft

 

ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ํ† ํฐ์„ ๋œฏ์–ด๋ณด๋ฉฐ ๊ฐ ์š”์†Œ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

 

1. Header(์•Œ๊ณ ๋ฆฌ์ฆ˜ & ํ† ํฐ ํƒ€์ž…)

์ถœ์ฒ˜: fakerdeft

Header์—๋Š” ์ „์ž์„œ๋ช… ์‹œ ์‚ฌ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ† ํฐ์˜ ํƒ€์ž…์„ ์ €์žฅํ•œ๋‹ค.

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•œ JWT์—์„œ๋Š” HS512 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

 

2. Payload(๋ฐ์ดํ„ฐ)

์ถœ์ฒ˜: fakerdeft

Payload์—๋Š” Claim์ด๋ผ๋Š” ํ† ํฐ์—์„œ ์‚ฌ์šฉํ•  ์ •๋ณด๋“ค์ด ๋‹ด๊ฒจ์žˆ๋‹ค.

์œ„์˜ PAYLOAD์—์„œ key-value ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•˜๋‚˜์˜ ์Œ๋“ค์ด ๋ชจ๋‘ Claim์ด๋‹ค.

์ธ์ฆ ์‹œ์— ํ† ํฐ์—์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋  ์ •๋ณด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์—ฌ๋Ÿฌ Claim๋“ค์„ JWT ํ† ํฐ ์ƒ์„ฑ ์‹œ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ค Claim์„ ๋„ฃ์„์ง€ ์ •ํ•œ ํ›„ ๋งˆ์Œ๋Œ€๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

 

JWT์˜ ํ‘œ์ค€ ์ŠคํŽ™์—๋Š” 7๊ฐœ์˜ Claim์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

๋ชจ๋‘ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

1. iss(Issuer) : ํ† ํฐ ๋ฐœ๊ธ‰์ž
2. sub(Subjec) : ํ† ํฐ ์ œ๋ชฉ - ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์‹๋ณ„๊ฐ’์ด ๋œ๋‹ค.
3. aud(Audience) : ํ† ํฐ ๋Œ€์ƒ์ž
4. exp(Expiration Time) : ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„
5. nbf(Not Before) : ํ† ํฐ ํ™œ์„ฑ ๋‚ ์งœ (์ด ๋‚ ์งœ ์ด์ „์˜ ํ† ํฐ์€ ํ™œ์„ฑํ™” ๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅ)
6. iat(Issued At) : ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ๊ฐ„
7. jti(JWT Id) : JWT ํ† ํฐ ์‹๋ณ„์ž (issuer๊ฐ€ ์—ฌ๋Ÿฌ ๋ช…์ผ ๋•Œ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’)

์ด๋ ‡๊ฒŒ ํ‘œ์ค€ ์ŠคํŽ™์— 7๊ฐœ์˜ Claim์ด ์ •์˜๋˜์–ด ์žˆ๊ณ ,

ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ถ”๊ฐ€๋กœ ์ž‘์„ฑํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ณ ์œ  ๋ฒˆํ˜ธ์™€ ๊ถŒํ•œ์„ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด,

์œ„์˜ JWT Payload์—์„œ 3๋ฒˆ์งธ, 4๋ฒˆ์งธ Claim์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ Claim์ธ 'memberId', 'role'์„ ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

์ด๋•Œ, ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ Payload์—๋Š” ์•”ํ˜ธํ™”๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๋ˆ„๊ตฌ๋‚˜ JWT Decoding์„ ํ†ตํ•ด Payload์˜ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

๋‹จ์ˆœํ•˜๊ฒŒ "์‹๋ณ„์„ ์œ„ํ•œ" ์ •๋ณด๋งŒ์„ ๋‹ด์•„๋‘์–ด์•ผ ํ•œ๋‹ค.

 

3. Signature(์„œ๋ช…)

์ถœ์ฒ˜: fakerdeft

Signature๋Š” ์•”ํ˜ธํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,

์™ธ๋ถ€์—์„œ ๋ณตํ˜ธํ™”๋ฅผ ์ง„ํ–‰ํ•ด๋„

์‹ค์ œ ์„œ๋ช…์ด ๋‚˜์˜ค์ง€ ์•Š๊ณ , ์•”ํ˜ธํ™”์˜ ๊ตฌ์กฐ๋งŒ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค.

 

์•”ํ˜ธํ™” ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ์•ž์„œ JWT ์ •์˜์— ๋Œ€ํ•ด์„œ ๋งํ•  ๋•Œ ์–ธ๊ธ‰๋˜์—ˆ๋˜

Base64 URL-safe Encode๋ฅผ ์‚ฌ์šฉํ•œ Header์™€ Payload๋ฅผ ์•”ํ˜ธํ™”ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋‹ค์Œ์€ your-256-bit-secret๋กœ 

์„œ๋ฒ„๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ณ ์œ  ๊ฐœ์ธํ‚ค๋ฅผ ์•”ํ˜ธํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—

์™ธ๋ถ€์—์„œ Signature๋ฅผ ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค.

 

JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์€

ํ† ํฐ ์ž์ฒด์— ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ์ (Self-contained)์ด ํŠน์ง•์ด๋‹ค.

ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์•Œ์•„์•ผ ํ–ˆ๋˜ Stateful ๋ฐฉ์‹์—์„œ JWT ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ๊ฒŒ ๋˜๋ฉด

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— Statelessํ•˜๊ฒŒ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋ณดํ†ต JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋œ๋‹ค.

1. ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ์š”์ฒญ

2. ์„œ๋ฒ„์—์„œ ์„œ๋ช…๋œ JWT ํ† ํฐ์„ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜

3. ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜๋œ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ ์‹œ ๋งˆ๋‹ค HTTP Header์— ํ† ํฐ์„ ๋‹ด์•„ ์š”์ฒญ

4. ์„œ๋ฒ„์—์„œ๋Š” ์š”์ฒญ Header์— ์žˆ๋Š” ํ† ํฐ์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์ฆ ํ›„ ์œ ํšจํ•˜๋‹ค๋ฉด ์š”์ฒญ์— ๋งž๋Š” ์‘๋‹ต ๋ฐ˜ํ™˜

 

โญ Access Token & Refresh Token

Access Token์€ ๋ณดํ†ต ์ธ์ฆ ์‹œ ์‚ฌ์šฉ๋˜๋Š” JWT๋ฅผ ๋งํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ

๋งŒ์•ฝ ํ•ด์ปค๊ฐ€ Access Token์„ ํƒˆ์ทจํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

ํ•ด์ปค๋Š” ํƒˆ์ทจํ•œ Access Token์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์ดํŠธ ๋‚ด ์ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ์ ‘๊ทผ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ด์งˆ ๊ฒƒ์ด๋‹ค.

 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ† ํฐ์ด ํ„ธ๋ฆฌ๋”๋ผ๋„ ๊ทธ Access Token์€ ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฐ–์— ๋ชป ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์‘์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ณต๊ต๋กญ๊ฒŒ๋„

Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์œ ์ € ์ž…์žฅ์—์„œ ๋งค์šฐ ๊ท€์ฐฎ๊ณ  ๋ฒˆ๊ฑฐ๋กœ์šธ ๊ฒƒ์ด๋‹ค.

์งง์€ ์ฃผ๊ธฐ๋งˆ๋‹ค ์žฌ๋กœ๊ทธ์ธ์„ ํ•ด์„œ Access Token์„ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ 'ํ•ด์ปค ํƒˆ์ทจ ๋ฌธ์ œ-์‚ฌ์šฉ์ž์˜ ์ด์šฉ์„ฑ'์— trade-off๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ trade-off๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Refresh Token์ด๋‹ค.

Refresh Token์€ ์ธ์ฆ์ด ์•„๋‹Œ, Access Token์„ ์žฌ๋ฐœ๊ธ‰ ํ•ด์ฃผ๋Š” ์—ญํ• ์˜ JWT๋‹ค.

  • Access Token์€ ์ธ์ฆ ์ฒ˜๋ฆฌ ์—ญํ• 
  • Refresh Token์€ Access Token ์žฌ๋ฐœ๊ธ‰ ์—ญํ• 

๋งˆ์น˜ ํ˜ธํ…”์—์„œ ๋ฐฉ ํ‚ค(Access Token)๋ฅผ ์žƒ์–ด๋ฒ„๋ ค๋„
์‹ ๋ถ„์ฆ(Refresh Token)์œผ๋กœ ์ž์‹ ์„ ์ฆ๋ช…ํ•ด
๋‹ค์‹œ ๋ฐฉ ํ‚ค(Access Token)๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

 

Refresh Token์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด

Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž ์ž…์žฅ์—์„  Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์งง์•„๋„

Refresh Token์„ ๊ฐ™์ด ๋ณด๋‚ด๋ฉด Access Token์˜ ์žฌ๋ฐœ๊ธ‰์ด ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ

๊ณ„์† ์žฌ๋กœ๊ทธ์ธ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

 

Access Token์ด ๋งŒ๋ฃŒ๋˜๋ฉด Refresh Token์„ ํ•จ๊ป˜ ๋ณด๋‚ด์–ด

๋‹ค์‹œ Access Token์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์ž์„ธํ•œ ๊ฑด ์ดํ›„ ๊ธ€์—์„œ ๊ธฐ๋กํ•œ๋‹ค.


๐Ÿš€ ๊ฒฐ๋ก 

Session์ด๋‚˜ Cookie๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ 

JWT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์–‘ํ•œ๋ฐ,

์„œ๋ฒ„์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žก์•„๋จน๋Š” ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š”

Stateless ์ธ์ฆ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์—ฌ๋Ÿฌ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Session/Cookie ๋ฐฉ์‹์€ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ฐ˜๋ฉด

ํ† ํฐ ๋ฐฉ์‹์€ ์–ด๋–ค ์„œ๋ฒ„๋กœ ์š”์ฒญ์ด ๊ฐ€๋”๋ผ๋„ ํ† ํฐ ๊ฒ€์ฆ๋งŒ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—

ํ™•์žฅ์„ฑ์ด ์ข‹๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด์™ธ์—๋„

  • JWT๋Š” ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„œ๋ช…์ด ๋˜์–ด ์žˆ์–ด์„œ ์ •๋ณด์˜ ์œ„๋ณ€์กฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ๋˜ํ•œ, SSL/TLS์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    Cookie๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” CSRF(Cross Site Request Forgery)์™€ ๊ฐ™์€ ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • JWT๋Š” ๋ชจ๋ฐ”์ผ ์•ฑ, ์›น ์•ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ์™€ ์†์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋‹ค.
    ๋˜ํ•œ, CORS(Cross-Origin Resource Sharing) ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
    Session/Cookie ๋ฐฉ์‹์€ ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…(Same-Origin Policy)์— ๋” ์—„๊ฒฉํ•˜๊ฒŒ ์ œํ•œ๋  ์ˆ˜ ์žˆ๋‹ค.
  • JWT๋Š” OAuth, OpenID Connect์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ž˜ ์ž‘๋™ํ•œ๋‹ค.
    ์ด๋ฅผ ํ†ตํ•ด ์†Œ์…œ ๋กœ๊ทธ์ธ ๋“ฑ ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐฉ์‹์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ™์€ ์ด์œ ๋“ค์ด ์žˆ๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ

OAuth ๊ฐœ๋…๊ณผ

๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์„ ๊ธฐ๋กํ•œ๋‹ค.


๐Ÿš€ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ ๊ณผ์ • ์ธ๋ฑ์Šค

  • [Spring Security] ๋ณด์•ˆ๊ณผ Spring Security
  • ๐Ÿ‘‰ [Spring Security] ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„๊ธฐ (๋กœ๊ทธ์ธ์ด๋ž€, JWT) - 1
  • [Spring Security] ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„๊ธฐ (OAuth, ๋กœ๊ทธ์ธ ๊ตฌ์กฐ) - 2
๋Œ“๊ธ€์ˆ˜0