์์ง๋ ๋ก๊ทธ์ธ์์ ๋ฒ์ด๋์ง ๋ชปํ ๋
๊ทธ์น๋ง ๋๋ฌด ์ด๋ ค์.......
์ด๊ฑฐ ์ด๋ ค์ํ๋๊ฑฐ ๋๋ง ๊ทธ๋ฐ๊ฑฐ ์๋๊ฒ ์ฐ?.. ์ํผ
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์ ์ฉ ์ฟ ํค์!

'Spring Security' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [OAuth2] OAuth2 ๋ก๊ทธ์ธ ํ SuccessHandler ๊ตฌํ (1) | 2025.05.17 |
|---|---|
| [OAuth2] ๋ด๊ฐ ๋ณด๋ ค๊ณ ๋ง๋ OAuth2 ํ๋ฆ ์ ๋ฆฌ (1) | 2025.05.16 |
| [Spring Security] Refresh Token ๊ธฐ๋ฐ์ผ๋ก new AccessToken๋ฐ๋ API ๊ตฌํํ๊ธฐ (1) | 2025.05.05 |
| [Spring Security] Token Filter ๊ตฌํํ๊ธฐ (0) | 2025.05.05 |
| [Spring Security] SecurityContextHolder๋? (0) | 2025.05.05 |