๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring Security

[Spring Security] ์ฟ ํ‚ค vs ํ—ค๋”๋กœ JWT ๋ณด๋‚ด๊ธฐ

by ์šฐ์ฃผ๋ฌผ๊ณ ๊ธฐ 2025. 5. 15.
๋ฐ˜์‘ํ˜•

 

์•„์ง๋„ ๋กœ๊ทธ์ธ์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ๋ชปํ•œ ๋‚˜

๊ทธ์น˜๋งŒ ๋„ˆ๋ฌด ์–ด๋ ค์›Œ.......

์ด๊ฑฐ ์–ด๋ ค์›Œํ•˜๋Š”๊ฑฐ ๋‚˜๋งŒ ๊ทธ๋Ÿฐ๊ฑฐ ์•„๋‹ˆ๊ฒ ์ฐŒ?.. ์•”ํŠผ

 

OAuth2 ์นด์นด์˜ค๋กœ ๋กœ๊ทธ์ธํ•˜๋Š” ๋ถ€๋ถ„ ํ๋ฆ„์„ ๊ณต๋ถ€ํ•˜๋˜ ์ค‘์—,

์ธ๊ฐ€ ์ฝ”๋“œ ๋ฐ›๊ณ  -> ์—‘์„ธ์Šค ํ† ํฐ ๋ฐ›๊ณ  -> ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญํ•˜๊ณ 

-> ๊ทธ ์‚ฌ์šฉ์ž ์ •๋ณด๋กœ JWT ํ† ํฐ ๋งŒ๋“ค๊ณ 

-> ๊ทธ ํ† ํฐ์„ ์ฟ ํ‚ค์— ๋‹ด์•„์„œ ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ธ๋‹ค

-> ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•ด๋‹น ์ฟ ํ‚ค๋ฅผ ๋งค ์š”์ฒญ์‹œ ํฌํ•จํ•ด์„œ ๋ณด๋‚ธ๋‹ค

 

๊นŒ์ง€๋Š” ์•Œ๊ฒ ๋Š”๋ฐ,

๊ทธ๋Ÿผ ์™œ ๊ตณ์ด ์ฟ ํ‚ค๋ฅผ ์“ธ๊นŒ? ํ•˜๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ์Œ

 

์ฟ ํ‚ค๋ผ๋Š”๊ฒŒ,

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

์ด๋Ÿฐ ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ๋“ค์—ˆ๋Š”๋ฐ,

์ง€๊ธˆ๊นŒ์ง€์˜ ํ๋ฆ„์„ ๋ณด๋ฉด ์ด ์ฟ ํ‚ค์˜ ์žฅ์ ์ด ํ™œ์šฉ๋˜๋Š”๊ฒŒ ์–ด๋””์—๋„ ์—†์–ด๋ณด์ž„.

 

๊ทธ๋ž˜์„œ ์•Œ์•„๋ดค๋Š”๋ฐ,

์š”์•ฝํ•˜์ž๋ฉด  ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ์˜ ๋ณด์•ˆ๊ณผ, ๊ฐœ๋ฐœ์ž ํŽธ์˜์„ฑ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•จ.

 

Authorization ํ—ค๋”์— JWT ํ† ํฐ ๋‹ด์•„์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์€,

ํ”„๋ก ํŠธ์—์„œ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ง์ ‘ ํ—ค๋” ์„ค์ •์„ ํ•ด์ค˜์•ผํ•จ.

 

๊ทผ๋ฐ Cookie ๋ฐฉ์‹์€

์ž๋™์œผ๋กœ ์ฟ ํ‚ค๊ฐ€ ์š”์ฒญ์— ๋ถ™์Œ.

๋‹ค๋งŒ CSRF ๊ณต๊ฒฉ ์œ„ํ—˜์ด ์žˆ์–ด์„œ ์ถ”๊ฐ€ ๋Œ€์‘์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•จ.

 

// ํ—ค๋” ๋ฐฉ์‹
axios.get('/mypage', {
  headers: { Authorization: 'Bearer eyJ...' }
})

// ์ฟ ํ‚ค ๋ฐฉ์‹
axios.get('/mypage') // ์ž๋™์œผ๋กœ access_token ์ฟ ํ‚ค๊ฐ€ ํฌํ•จ๋จ

 

์ด๋Ÿฐ์‹์œผ๋กœ ๋งค๋ฒˆ ํ—ค๋”์— ๋„ฃ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋”ฐ๊ณ  ํ•จ.

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ† ํฐ์„ ์ง์ ‘ ๋ณด๊ด€ํ•˜๊ณ  ํ—ค๋”์— ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†์Œ.

 

 

๋‹ค๋งŒ ๋ณด์•ˆ์€ ์ข€ ๋” ์‹ ๊ฒฝ์จ์•ผํ•œ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ๋˜ ๊ถ๊ธˆํ–ˆ๋˜๊ฒŒ, ์ฟ ํ‚ค๋ฅผ ์“ฐ๊ฒŒ ๋˜๋ฉด

๋กœ๊ทธ์ธ์ด ์œ ์ง€๋˜๊ณ ~ ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค~~ ์ด๋Ÿฐ ๋ง์ด ํ•ญ์ƒ ๋ถ™์—ˆ๋–ค๊ฑฐ ๊ฐ™์€๋ฐ,

์ด๊ฒŒ ๋ญ”์†Œ๋ฆฌ๋žŒ? ์‹ถ์—ˆ๋Š”๋ฐ,

 

=

ํ”„๋ก ํŠธ์—์„œ ๋งค๋ฒˆ Authorization ํ—ค๋”๋ฅผ ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ž„.

 

 


๊ทธ๋ฆฌ๊ณ  ์ฟ ํ‚ค๋ฅผ ์“ฐ๋ฉด, ํ”„๋ก ํŠธ์—์„œ ํ† ํฐ์„ ๋ณด๊ด€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ ?

ํ† ํฐ์€ ๋ณด๊ด€ ์•ˆํ•˜๋”๋ผ๋„ ์ฟ ํ‚ค๋Š” ๋ณด๊ด€ ํ•ด์•ผ๋˜์ž–์•„.

๊ทธ๋Ÿผ ๊ทธ๊ฒŒ ๊ทธ๊ฑฐ ์•„๋‹˜???

 

 

=

ํ—ค๋” ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ, ํ”„๋ก ํŠธ๋Š”

JWT ๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€or์„ธ์…˜์Šคํ† ๋ฆฌ์ง€ ์— ์ €์žฅํ•˜๊ณ 

์š”์ฒญ ๋ณด๋‚ผ๋•Œ๋งˆ๋‹ค ํ—ค๋”์— ์ง์ ‘ ๋ผ์›Œ๋„ฃ์–ด์„œ ๋ณด๋‚ด์•ผํ•จ.

 

๊ทผ๋ฐ ์ฟ ํ‚ค ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ, ํ”„๋ก ํŠธ๋Š”

JWT๋ฅผ ๋ณด๊ด€ ์•ˆํ•จ!

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•Œ์•„์„œ ์ฟ ํ‚ค๋ฅผ ์ฒจ๋ถ€ํ•จ.

๊ทผ.๋ฐ!!!

๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์—„์ฒญ๋‚œ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•จ.

์ฟ ํ‚ค ๋ฐฉ์‹์€, ์Šคํฌ๋ฆฝํŠธ ํ•ดํ‚น์œผ๋กœ ํ† ํฐ ํƒˆ์ทจ ์œ„ํ—˜์ด ๊ฑฐ์˜ ์—†์ง€๋งŒ

๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋‚˜ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์— ๋ณด๊ด€ํ•˜๊ฒŒ ๋˜๋ฉด

๊ฑ getItem.("token")ํ•˜๋ฉด ๋˜๊ธฐ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ํ›”์ณ๊ฐ€๊ธฐ ๊ฐ€๋Šฅ

 


๊ทธ์น˜๋งŒ ๋ฐฑ์—”๋“œ ์ž…์žฅ์—์„œ๋Š” ํ•œ๋ฒˆ ๋” JWT ๋ฅผ ์–ป๊ธฐ์œ„ํ•ด ํŒŒ์‹ฑํ•ด์•ผํ•˜๋Š” ์ˆ˜๊ณ ๊ฐ€ ๋А๋Š”๊ฑฐ ์•„๋‹ˆ๋ƒ?

 

=

๋งž์Œ!

๋‹ค๋งŒ, ๋ณด์•ˆ์„ฑ๊ณผ ํ”„๋ก ํŠธ์˜ ํŽธ์˜์„ฑ์— ๋น„ํ•ด์„œ๋Š”

๋ฐฑ์—”๋“œ์—์„œ ํ•œ๋ฒˆ ํŒŒ์‹ฑํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ๋œ ์ˆ˜๊ณ ๋กœ์›€

 

 

 

 

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์•Œ์•„์„œ ์ฒจ๋ถ€ํ•œ๋‹ค๋Š”๊ฒŒ ๋ญ”๋œป์ด๋ƒ?

 

=

์‰ฝ๊ฒŒ ๋งํ•ด, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ ์กฐ๊ฑด์ด ํ•ด๋‹น๋˜๋ฉด, ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์š”์ฒญ์— ์‹ค์–ด์„œ ๋ณด๋ƒ„

 

1. ์š”์ฒญํ•˜๋Š” ๋„๋ฉ”์ธ๊ณผ ๊ฒฝ๋กœ = ์ฟ ํ‚ค์˜ ์„ค์ •

2. ์ฟ ํ‚ค๊ฐ€ ์•„์ง ๋งŒ๋ฃŒ ์•ˆ๋์„ ๋•Œ.

 

์˜ˆ๋ฅผ๋“ค์–ด, ์„œ๋ฒ„์—์„œ

Set-Cookie: access_token=abc.def.ghi; Path=/; Domain=yourdomain.com;

์ด๋Ÿฐ์‹์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•จ.

 

๊ทธ๋Ÿฌ๋ฉด, ์š”์ฒญ URL์ด https://yourdomai.com/ or ๊ทธ ํ•˜์œ„ ๊ฒฝ๋กœ์ผ ๋•Œ

or ์ฟ ํ‚ค ์œ ํšจ๊ธฐ๊ฐ„ ์•ˆ์ง€๋‚ฌ์„ ๋•Œ

์ด ์ฟ ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ๋ถ™์ด๋Š”๊ฑฐ์ž„.

 

 

= ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์ž๋Š” ์•”๊ฒƒ๋„ ์•ˆํ•ด๋„ ๋จ!

 

 


๊ทธ๋Ÿผ ๋งŒ์•ฝ์˜ ์ฟ ํ‚ค ์•ˆ์˜ JWT ํ† ํฐ์ด ์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€๋‚ฌ์œผ๋ฉด ์–ด๋–กํ•˜๋ƒ?

 

=

- ๋ธŒ๋ผ์šฐ์ €๋Š” ํ† ํฐ์ด ๋งŒ๋ฃŒ๋๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ๋•Œ๋ฌธ์—

- ์ฟ ํ‚ค์— ์žˆ์œผ๋‹ˆ๊นŒ ๊ฑ ๋ฌด์กฐ๊ฑด ๋ฌด์ง€์„ฑ ๋ณด๋ƒ„

- ์„œ๋ฒ„๊ฐ€ ๋ฐ›๊ณ , JWT ํŒŒ์‹ฑํ•œ ๋‹ค์Œ์—, ์œ ํšจ๊ธฐ๊ฐ„ ๋ณด๊ณ 

- ๋งŒ๋ฃŒ๋์œผ๋ฉด 401 Unauthorizaed ๋ณด๋ƒ„

- ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ด์šฉํ•ด์„œ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ API์š”์ฒญํ•จ

- ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„๋Š”, ์ƒˆ JWT ํ† ํฐ ๋งŒ๋“ค์–ด์„œ new ์ฟ ํ‚ค๋ฅผ ์คŒ!

- ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ ‡๊ฒŒ ๋ฐ›์€ new ์ฟ ํ‚ค๋กœ ๋ฎ์–ด์”€

 

 

๊ทธ๋Ÿฌ๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณด๊ด€ํ•˜๋Š”๊ฑฐ ์•„๋‹ˆ๋ƒ?

๊ธฐ๊ป ํ† ํฐ ๋ณด๊ด€ํ•˜๋ฉด ์œ„ํ—˜ํ•˜๋‹ค๊ณ  ํ•ด์„œ ์ฟ ํ‚ค ์ €์žฅํ•˜๋Š”๊ตฌ๋งŒ

๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ €์žฅํ•˜๋ฉด ๋ฌด์Šจ ์†Œ์šฉ?

 

=

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ JS๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ์œ„ํ—˜ํ•จ!

๋”ฐ๋ผ์„œ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ๋„ HttpOnly ์ฟ ํ‚ค๋กœ ์ €์žฅํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ž„.

 

 

 

 


'ํ•ด๋‹น ๋„๋ฉ”์ธ์˜ ์ฟ ํ‚ค๋ฅผ ์š”์ฒญ์— ๊ฐ™์ด ๋ณด๋ƒ„' ์—์„œ ํ•ด๋‹น ๋„๋ฉ”์ธ?

๋„๋ฉ”์ธ๋ณ„๋กœ ์ฟ ํ‚ค๊ฐ€ ๋‚˜๋ˆ ์ ธ์žˆ๋ƒ?

ํ•œ๊ฐœ์˜ ์ฟ ํ‚ค ์•ˆ์—, ํ•œ๊ฐœ์˜ JWT ํ† ํฐ. ์ฆ‰ ํ•œ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๋‹ด๊ธฐ๋Š”๊ฑฐ ์•„๋‹ˆ์•ผ? ๊ทธ๋Ÿผ ๋„๋ฉ”์ธ๋ณ„๋กœ ์ €์žฅ๋ ๊ฒŒ ์•„๋‹ˆ๋ผ ์‚ฌ๋žŒ๋ณ„๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š”๊ฑฐ ์•„๋‹˜?

 

=

์ฟ ํ‚ค๋Š” ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ €์žฅ๋˜๊ณ  ๊ตฌ๋ถ„๋จ.

 

ํ•œ ์‚ฌ์šฉ์ž๊ฐ€, ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด, ๊ฐ ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ฟ ํ‚ค๋“ค์ด ๋”ฐ๋กœ ์ €์žฅ๋จ.

ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด์„œ, ์—ฌ๋Ÿฌ๋ช…์ด ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ์—๋„

๊ฐ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž์‹ ๋งŒ์˜ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ด๊ธฐ๋•Œ๋ฌธ์— ์œ ์ €๊ฐ€ ๊ตฌ๋ถ„์ด ๋˜๋Š”๊ฑฐ์ž„.

 

์˜ˆ๋ฅผ๋“ค์–ด ๋‚ด๊ฐ€ myapp.com์— ์ ‘์†ํ–ˆ์Œ

-> ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์คŒ. ๊ทธ ์ฟ ํ‚ค ์•ˆ์—๋Š” JWT ํ† ํฐ ๋“ค์–ด์žˆ๊ณ 

์ด ์ฟ ํ‚ค๋Š” ๋„๋ฉ”์ธ = myapp.com ์ „์šฉ ์ฟ ํ‚ค์ž„..

 

๊ทธ ๋‹ค์Œ์— ๋‚ด๊ฐ€ kakao.com์— ์ ‘์†ํ–ˆ์Œ

-> ๋˜ ๋‹ค๋ฅธ ์ฟ ํ‚ค๊ฐ€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒ๊น€

๊ทธ๊ฑด kakao.com์ „์šฉ ์ฟ ํ‚ค์ž„!

 

 

 

 

๋ฐ˜์‘ํ˜•