์ธ์ฆ์ ํ์์ฑ
HTTP ํต์ ์ ์์ฒญ๊ณผ ์๋ต์ด ์ข ๋ฃ๋๋ฉด ์ฐ๊ฒฐ์ ๋๋ Connectionless ํน์ฑ๊ณผ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ์ด๋ ํ ์ํ๋ ์ ์งํ์ง ์๋ Statelessํ ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ค.
๋ฐ๋ผ์, ๋ก๊ทธ์ธ์ ์ ์งํ๊ธฐ ์ํด์ ์ฟ ํค, ์ธ์ , ํ ํฐ์ ์ฌ์ฉํ๋ค.
- Connectionless ํ๋กํ ์ฝ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญํ๊ณ ์๋ต์ ๋ฐ์ผ๋ฉด ์ฐ๊ฒฐ์ ๋๋ ์ฒ๋ฆฌ ๋ฐฉ์
- Stateless ํ๋กํ ์ฝ
- ํด๋ผ์ด์ธํธ์ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง์ง ์๋ ์๋ฒ ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ค.
1. ์ฟ ํค ๐ช
์ฟ ํค๋ Key-Value ํ์์ ๋ฌธ์์ด๋ก ์ฌ์ฉ์์๊ฒ ๋งก๊ฒจ๋ ๋๋ ๊ณต๊ฐ ๊ฐ๋ฅํ ์ ๋ณด๋ฅผ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ์ํจ๋ค.
์ฟ ํค ๋์ ๋ฐฉ์
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ํด ์๋ตํ ๋, ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ์์ ์ ๋ณด๋ฅผ Response Header์ set-cookie์ ๋ด๋๋ค.
- ํด๋ผ์ด์ธํธ ์ธก ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ฟ ํค๋ฅผ ์ฟ ํค ์ ์ฅ์์ ์ ์ฅํ๊ณ ๋ค๋ฅธ ์์ฒญ์ ํ ๋๋ง๋ค ์ ์ฅ๋ ์ฟ ํค๋ฅผ Request Header์ cookie์ ๋ด๋๋ค.
- ์๋ฒ๋ ์ ๋ฌ๋ฐ์ ์ฟ ํค๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ ์ ์๋ค.
์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ๋ด์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ document.cookie๋ฅผ ํตํด ์ฝ๊ฒ ์ฟ ํค์ ์ ๊ทผํ ์ ์๊ณ ์ด๋ฅผ ์ด์ฉํด ์ฟ ํค์ ๋ฐ์ดํฐ๋ฅผ ์ด์ด๋ณด๊ฑฐ๋ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ทจ์ฝํ๋ค. ๋ฐ๋ผ์ ์ ๋ ๊ฐ์ธ์ ์ธ ๋น๋ฐ ์ ๋ณด๋ค์ ์ฟ ํค์ ์ ์ฅํ๋ฉด ์๋๋ค.
๋ฐ๋ผ์ ๋ณด์์ ๋ฏผ๊ฐํ ์ฌ์ดํธ์์๋ ๋ง๋ฃ๊ธฐํ์ ์งง๊ฒ ๊ฐ์ ธ๊ฐ๋๊ฒ ์ข๋ค.
Secure ์ฟ ํค
Secure ์ฟ ํค๋ HTTPS ํ๋กํ ์ฝ ์์์ ์ํธํ๋ ์์ฒญ์ผ ๋๋ง ์ ์ก๋๋ ์ฟ ํค์ด๋ค.
HttpOnly ์ฟ ํค
HttpOnly ์ฟ ํค๋ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด document.cookie์ ๊ฐ์ JS๋ก ์ฟ ํค๋ฅผ ์กฐํํ๋ ๊ฒ์ ๋ง์์ค๋ค.
ํด๋น ๋ฐฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์ฟ ํค๋ฅผ ์กฐํํ ์ ์๊ณ , ์๋ฒ๋ก ์์ฒญ ๋ณด๋ผ ๋ ์์์ ๊ฐ์ด ์ ์ก๋๋ค.
Secure ์ฟ ํค์ HttpOnly ์ฟ ํค๋ฅผ ์ ์ฉํ๋๋ผ๋ ์ฟ ํค๋ ๋ณธ์ง์ ์ผ๋ก ์์ ํ์ง ์๊ณ ๋ณด์์ ์ค์ง์ ์ผ๋ก ์ ๊ณตํ์ง๋ ์๊ธฐ ๋๋ฌธ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ฅํด์๋ ์๋๋๊ฑด ๋๊ฐ๋ค.
2. ์ธ์ ๐
์ธ์ ์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ ์์ ๋ถํฐ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํ์ฌ ์ฐ๊ฒฐ์ ๋๋ด๋ ์์ ๊น์ง ์ํ๋ฅผ ์ ์งํ๋ ๊ธฐ์ ์ด๋ค. (Stateful)
์ธ์
์ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์ฟ ํค ๋์ ์ ์ฌ์ฉ์์ ์๋ณ์์ธ Session ID๋ฅผ ์ ์ฅํ๋ค.
์๋ฒ์์๋ ์ธ์ฆ ์ ๋ณด์ ๋๋ถ์ด ํด๋น Session ID์ ํด๋นํ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ณ๋๋ก ์ ์ฅํ์ฌ ๊ด๋ฆฌํ๋ค.
์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋๋ ๋ก์ปฌ ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์ ์๋ค.
๋ธ๋ผ์ฐ์ ๋ฅผ ์ข
๋ฃํ๊ฑฐ๋, ์๋ฒ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ์ธ์
์ ์ญ์ ํ์ฌ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ํ ์ ์์ผ๋ฏ๋ก ์ฟ ํค๋ณด๋ค ๋ณด์์ฑ์ด ์ข๋ค.
๋ํ, ์ ์ฅ ๋ฐ์ดํฐ์ ์ ํ์ด ์๋ค๋ผ๋ ํน์ง์ด ์๋ค.
์๋ฒ์์ ์ธ์ ์ ๋ฐ๋ก ๊ด๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ๋ถํ๊ฐ ๋์ด๋ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
์ธ์ ๋์ ๋ฐฉ์
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ํด ์๋ตํ ๋, ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ ์ ์๋ ๊ฐ๋ณ Session ID๋ฅผ ๋ถ์ฌํ๋ค.
- Session ID๋ฅผ ๋ด์ ์ธ์ ์ฟ ํค์ ํจ๊ป Response๋ฅผ ์งํํ๋ค.
- ํด๋ผ์ด์ธํธ ์ธก ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ฟ ํค๋ฅผ ์ฟ ํค ์ ์ฅ์์ ์ ์ฅํ๊ณ ๋ค๋ฅธ ์์ฒญ์ ํ ๋๋ง๋ค ์ ์ฅ๋ ์ธ์ ์ฟ ํค๋ฅผ Request Header์ ๋ด์์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ์ ๋ฌ๋ฐ์ ์ฟ ํค๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ ์ ์๋ค.
์ธ์ ID์๋ ํน๋ณํ ๊ฐ์ด ๋ค์ด์์ง ์๊ณ , ์๋ฒ์์ ์ ์ฅํ๊ณ ์๋ ์ธ์ ID์ value์ ์๋ณํ ์ ์๋ ๊ฐ์ด ๋ค์ด์์ผ๋ฏ๋ก ์ธ์ ID๊ฐ ํ์ทจ๋นํ๋๋ผ๋ ์ฟ ํค๋ณด๋ค๋ ์์ ํ๋ค.
ํ์ง๋ง ์ธ์ ID๋ฅผ ํ์ทจ๋นํ๋ฉด ๋ค๋ฅธ ์ฌ๋์ด ๋ง์๋๋ก ์ฌ์ฉํ ์ ์์ง๋ง ํด๋น ๋ถ๋ถ์ ์๋ฒ์์ IP๋ฅผ ํน์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
์ฟ ํค์ ์ธ์ ๋น๊ต
3. ํ ํฐ
๊ธฐ์กด ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ์๋ฒ๊ฐ ํ์ผ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๊ณ ์ด๋ฅผ ์กฐํํ๋ ๊ณผ์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค. ํ์ง๋ง ํ ํฐ์ ์ธ์ ๊ณผ๋ ๋ฌ๋ฆฌ ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ ์คํ ๋ฆฌ์ง ๋ฑ์ ํตํด ์ธ์ ์ ๊ด๋ฆฌํ๋ ์๋ฒ์ ๋ถ๋ด์ ๋ ์ ์๋ค.
ํ์ง๋ง, ์ค์ง์ ์ผ๋ก ๋ก๊ทธ์์ ์ฒ๋ฆฌ ๋ฑ์ ํ๊ธฐ ์ํด์๋ Hybrid ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํจ๊ป ์ฌ์ฉํ๋๊ฒ ์ผ๋ฐ์ ์ด๋ค.
ํ ํฐ ๋์ ๋ฐฉ์
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ํด ์๋ตํ ๋, ํด๋ผ์ด์ธํธ์๊ฒ ํ ํฐ์ ๋ถ์ฌํ๋ค.
- ํด๋ผ์ด์ธํธ ์ธก์์ ํ ํฐ์ ์ ์ฅํด ๋๊ณ , ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค Request Header์ ์ถ๊ฐํ์ฌ ์์ฒญํ๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ํ ํฐ์ด ์๋ฒ์์ ์ ๊ณตํ ํ ํฐ์ธ์ง ๊ฒ์ฆํ๋ค.
ํ ํฐ์ ๋ํ์ ์ธ ๋ฐฉ์์๋ JWT๊ฐ ์๋ค. JWT๋ ๋จ์ ์น ํ ํฐ(SWP) ๋ฐ SAML(Security Assertions Markup Language) ํ ํฐ์ ๋นํด ์ฌ๋ฌ ์ด์ ์ด ์๋ค.
- More Compact : JSON์ผ๋ก ์ธ์ฝ๋ฉ ํ๊ธฐ ๋๋ฌธ์, XML๋ก ์ธ์ฝ๋ฉํ๋ SAML ํ ํฐ๋ณด๋ค ์๋ค.
- More Secure: JWT๋ ๊ณต๊ฐํค์ ๊ฐ์ธํค๋ฅผ ๋๋์ด ์๋ช ์ด ๊ฐ๋ฅํ๋ค. HMAC ์ํธ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ์ํธํ๋ ์๋ช ์ด ๊ฐ๋ฅํ๋ค.
- More Common: JSON์ object ๋ฐฉ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ฏ๋ก ์ ๊ทผ์ฑ์ด ์ข๋ค.
- Easier to process: JWT๋ ์ธํฐ๋ท ๊ท๋ชจ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์, ๋ชจ๋ฐ์ผ์์ ์ฒ๋ฆฌํ ๋๋ ์ฝ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
JWT ํ ํฐ์ ๊ตฌ์กฐ
ํ ํฐ์ Header, Payload, Signature ์ด 3ํํธ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
Header - JWT
JWT์์ ์ฌ์ฉํ ํ์ ๊ณผ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ๊ฐ ๋ค์ด์๋ค. ์ฆ, ์ด๋ป๊ฒ ๊ฒ์ฆํ๋๊ฐ์ ๋ํ ๋ด์ฉ์ ๋ด๊ณ ์๋ค.
alg๋ ์๋ช ์ ์ฌ์ฉํ๋ ํด์ ์๊ณ ๋ฆฌ์ฆ์ด๊ณ , typ๋ ์๋ช ์ ์ฌ์ฉํ๋ ํค(public/private key)๋ฅผ ์๋ณํ๋ ๊ฐ์ด๋ค.
Payload - JWT
์๋ฒ์์ ์ฒจ๋ถ๋ ์ฌ์ฉ์ ๊ถํ ์ ๋ณด์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ์๋ค. Payload์ ์๋ ์์ฑ๋ค์ Claim Set์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
Claim Set์ JWT์ ๋ํ ๋ด์ฉ(ํ ํฐ ์์ฑ์์ ์ ๋ณด, ์์ฑ์ผ์ ๋ฑ)์ด๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ์ฃผ๊ณ ๋ฐ๊ธฐ๋ก ํ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋๋ค.
Signature - JWT
Header์ Payload๋ฅผ Base64 URL-safe Encode๋ฅผ ํ ์ดํ ํด๋น ๋ฌธ์์ด์ ์ ์์๋ช
ํ ๊ฐ์ด๋ค.
Header์ ๋ช
์๋ ํด์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น๋ฐํค๋ฅผ ์ด์ฉํด ์ ์์๋ช
์ ์์ฑํ๋ค. ๊ทธ ํ ๋ง์ง๋ง์ผ๋ก ํ๋ฒ ๋ Base64 URL-safe Encode ํ๋ค.
JWT ํ ํฐ ์ธ์ฆ ๊ณผ์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๋ก๊ทธ์ธ ์์ฒญํ๋ค.
- ์์ด๋ ํจ์ค์๋ ์ผ์น ์ ์๋ฒ๋ Jwt Access Token๊ณผ Refresh Token์ ๋ฐ๊ธํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ํ ํฐ์ ์ด์์ด ์์ผ๋ฉด ์์ฒญํ ์ ๋ณด๋ฅผ ์๋ตํ๋ค.
- ๋ง์ฝ ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋์๋ค๋ฉด ํด๋ผ์ด์ธํธ์๊ฒ ๋ง๋ฃ์ฌ์ค์ ์๋ ค์ฃผ๊ณ , ํด๋ผ์ด์ธํธ๋ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ด์ฉํ์ฌ ์ก์ธ์ค ํ ํฐ์ ์ฌ๋ฐ๊ธ ๋ฐ์ ์๋ก ์ ์ฅํ๋ค.
JWT ์ฅ์
- Header์ Payload๋ฅผ ๊ฐ์ง๊ณ Signature๋ฅผ ์์ฑํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์๋ณ์กฐ๋ฅผ ๋ง์ ์ ์๋ค.
- ์ธ์ฆ ์ ๋ณด์ ๋ํ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์์๋ค. (์ฌ์ค ์ค์ ์๋น์คํ๋ ค๋ฉด ๋ก๊ทธ์์ + ๋ฆฌํ๋ ์คํ ํฐ ์ ์ฅ์ ์ํด ํ์ํ๋ค..)
- JWT๋ ์์ฒด์ ์ผ๋ก ๊ธฐ๋ณธ ์ ๋ณด์ ์ ๋ฌํ ์ ๋ณด ๋ฐ ํ ํฐ์ด ๊ฒ์ฆ๋์์์ ์ฆ๋ช ํ๋ ์ ์์๋ช ๋ฑ ํ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ค.
- ํ์ฅ์ฑ์ด ์ฐ์ํ๋ค. Statelessํ๊ธฐ ๋๋ฌธ์ ๋ถ์ฐ ํ๊ฒฝ์์๋ ๋ฌธ์ ์๋ค.
- ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ์ฉํ ์ ์๋ค. (์ฑ์ ์ฟ ํค์ ์ฅ์๊ฐ ์์ - Web View๊ฐ ์๋๋)
JWT ๋จ์
- ์ฟ ํค, ์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ JWT๋ ํ ํฐ ๊ธธ์ด๊ฐ ๊ธธ์ด ์ธ์ฆ ์์ฒญ์ด ๋ง์์ง์๋ก ๋คํธ์ํฌ ๋ถํ๊ฐ ์ฌํด์ง๋ค.
- Payload ์์ฒด๋ ์ํธํ๊ฐ ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์ ์ค์ํ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค.
- ํ ํฐ์ ํ์ทจ๋นํ๋ฉด ๋์ฒ๊ฐ ์ด๋ ต๋ค.
- ํน์ ์ฌ์ฉ์์ ์ ์์ ๊ฐ์ ๋ก ๋ง๋ฃํ๊ธฐ ์ด๋ ต๋ค. (์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด ๊ฐ๋ฅํจ)
Sliding Sessions
๋ณด์์ฑ๊ณผ ํธ์์ฑ์ ๋ชจ๋ ์ก์ ์ ์๋ ์ ๋ต์ด๋ค. ์ด ์ ๋ต์ ์ธ์ ์ ์ง์์ ์ผ๋ก ์ด์ฉํ๋ ์ ์ ์๊ฒ ์๋์ผ๋ก ๋ง๋ฃ ๊ธฐํ์ ๋๋ ค์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋งค ์์ฒญ๋ง๋ค ์๋ก์ด ํ ํฐ์ ๋ด๋ ค์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, ๊ธ์ ์์ฑํ๋ค๊ฐ ์ธ์ฆ์ด ๋ง๋ฃ๋๋ ๋ฌด์์ด ๊ฒฝ์ฐ๋ฅผ ๋ง๊ธฐ ์ํด ๊ธ ์์ฑ์ ์์ํ ๋ ๋ฐ๊ธํด์ค๋ค๊ฑฐ๋, ์ผํ๋ชฐ์์ ์ฅ๋ฐ๊ตฌ๋์ ์ํฐ๋ฉ์ ๋ด๋ ๊ฒฝ์ฐ์ ๋ฐ๊ธํด์ฃผ๋ ๋ฑ์ ์ฌ๋ฌ ์ ๋ต์ ์๋น์ค๋ง๋ค ์ ํด์ ์ฌ์ฉํ ์ ์๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ๋ฐ๊ธ ์๊ฐ (iat) ์์ฑ์ ์ฐธ์กฐํด์ ๊ฐฑ์ ์์ฒญ์ ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
Hybrid ํ ํฐ ๋ฐฉ์
์ฌ์ฉ์์ ์ํ๋ฅผ ์ ์งํ์ง ์๋ Statelessํ ์๋น์ค๋ฅผ ์ด์ํ ๋๋ ๋ณด์ ์ด์๊ฐ ๋ฐ์ํ๋ค.
JWT๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ Access Token์ธ์ Refresh Token์ ๋์ ํ๋ค๊ฑฐ๋ Sliding Sessions ์ ๋ต์ ํ์ฉํ ์ ์๋ค.
ํ์ง๋ง ํด๋น ๋ฐฉ์์ ์ด์ฉํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ์ ์ฅ์๊ฐ ํ์ํ๊ฒ ๋์ด Statelessํ๋ค๊ณ ์ข์ํ๋ ์ฅ์ ์ ์์ด์ง๊ฒ ๋๋ค.
Refresh Token
ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฒ๋ Access Token๊ณผ ๊ทธ๋ณด๋ค ๋ง๋ฃ๊ธฐ๊ฐ์ด ๊ธด Refresh Token์ ํจ๊ป ๋ด๋ ค์ค๋ค.
์ฃผ๋ก, Access Token์ 30๋ถ ๋ด์ธ ๊ทธ๋ฆฌ๊ณ Refresh Token์ 2์ฃผ์์ ํ๋ฌ ์ ๋์ ๋ง๋ฃ ๊ธฐ๊ฐ์ ๋ถ์ฌํ๋ค.
ํด๋ผ์ด์ธํธ๋ Access Token์ด ๋ง๋ฃ๋์๋ค๋ ์๋ต์ ๋ฐ๊ฒ ๋๋ฉด, Refresh Token์ ์ด์ฉํ์ฌ Access Token์ ์ฌ๋ฐ๊ธ ๋ฐ์ ์ ์๋ค.
์ด๋, Refresh Token๊น์ง ๊ฐ์ด ์ฌ๋ฐ๊ธ ๋ฐ์ ์ ์๋ค.
ํน์ฌ๋, Refresh Token ๊น์ง ๋ง๋ฃ๋์๋ค๋ฉด ๋ค์ ๋ก๊ทธ์ธ์ ํด์ผํ๋ค.
Refresh Token์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ถ๊ฐ์ ์ธ ์ ์ฅ์์ I/O ์์ ์ด ํ์ํ๋ค๋ ์๋ฏธ์ด๋ฉฐ, ์์์ ๋งํ๋ฏ ๊ธฐ์กด์ JWT ์ฅ์ ์ ์ด๋ฆด ์๋ ์๋ค. ๋ํ, Refresh Token์ ํ์ทจ๋๋ฉด ์๋๋ฏ๋ก ํด๋ผ์ด์ธํธ๋ ๋ณด์์ด ์ ์ง๋๋ ๊ณต๊ฐ์ ์ด๋ฅผ ์ ์ฅํด์ผ ํ๋ค.
Refresh Token์ ์๋ฒ์์ ๋ฐ๋ก ์ ์ฅ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ก ํ ํฐ์ ๋ง๋ฃ์ํค๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
JWT์ ์ํฌ๋ฆฟ ํค
JWT ์ํฌ๋ฆฟ ํค๊ฐ ๋ ธ์ถ๋๋ค๋ฉด ํ ํฐ์ ์์ฑํ๊ณ ๋ณ์กฐํ์ฌ ์ ์์ ์ธ ํ๋์ด ๋ชจ๋ ๊ฐ๋ฅํด์ง๋ฏ๋ก ์์ ํ๊ฒ ์ค์ ํ ํ์๊ฐ ์๋ค.
์ํฌ๋ฆฟ ํค์ ๊ฒฝ์ฐ ์ต์ 512bits(์ฝ 64๊ธ์) ์ด์์ ๊ฐ์ผ๋ก ์ค์ ํด์ผ ํ๋ค.
์ํธํ ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก HS256(HMAC with SHA-256)์ ์ฌ์ฉํ๋ค.
๋์นญํค ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํฌ๋ฆฟ ํค๊ฐ ์/๋ณตํธํ ๋ชจ๋์ ์ฌ์ฉ๋๋ค. ํ์ง๋ง, ์/๋ณตํธํ ๋ชจ๋์ ์ํฌ๋ฆฟ ํค๊ฐ ์ฌ์ฉ๋๋ค๋ณด๋ ํ์ทจ๋นํ์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๋ฉด ๋น๋์นญํค(๊ณต๊ฐํค) ๋ฐฉ์๋ณด๋ค ์์ ํ์ง ์์ ์ ์๋ค.
๋ฐ๋ผ์, RS256๊ณผ ๊ฐ์ ๋น๋์นญํค ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ด๋ค. ๊ณต๊ฐํค๊ฐ ํ์ทจ๋์ด๋ ํ๋ผ์ด๋น ํค๋ฅผ ๋ชจ๋ฅด๋ฉด ๊ณต๊ฒฉ์๋ ํ ์ ์๋ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ๋ ๋ฆฌ์์ค๊ฐ ๋ง์ด ๋ ๋ค๋ ๋จ์ ์ด ์์ผ๋ Trade off๋ฅผ ์ ์๊ฐํด์ ์ ํํ๋ฉด ๋๋ค.
'๐ Backend > ๐ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
OncePerRequestFilter ์ฌ์ฉํ๋ ์ด์ (0) | 2024.04.03 |
---|---|
Spring Boot 1.x -> 2.x Mirgration ์งํํ๋ฉด์ (0) | 2024.03.26 |
Spring Cloud #1 (0) | 2023.05.28 |
ํ์ผ ์ ๋ก๋ ํ๋ ๋ฐฉ๋ฒ(Form, Spring) (0) | 2022.09.12 |
DispatcherServlet์ doDispatch์์ HandlerMapping ๊ณผ์ ์ ๋ํด์ (0) | 2022.07.31 |