๐์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
๐์ธ์ ์ด๋?
์ธ์ ์ด๋ ์๋ฒ์ธก์ ์ ์ฅ๋๋ ์์์ํ์ ๋ณด์ด๋ค. ์๋ฒ ์ธก์ ์ ์ฅ๋๋ฏ๋ก ๋ณด์์ฑ์ด ๋์ง๋ง, ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์๋ค.
์ฌ์ฉ์๊ฐ ์ ์ํ๋ฉด ์๋ฒ๋ ๊ณ ์ ํ ์ธ์ ID๋ฅผ ์์ฑํด ์ฌ์ฉ์์๊ฒ ์ ์กํ๋ค. ์ฌ์ฉ์๋ ์ฟ ํค/๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋ฑ์ ์ธ์ ID๋ฅผ ์ ์ฅํ๋ค. ์ธ์ ID ์์ฒด์๋ ์ค์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฏ๋ก ๋ณด์์ฑ ์ธก๋ฉด์์ ์์ ํ๋ค. ๋ง์ฝ, ์ธ์ ID๊ฐ ํ์ทจ ๋นํ๋ค๋ฉด ์๋ฒ๋ ๋จ์ง ํด๋น ์ธ์ ์ ๋ง๋ฃ์ํค๋ฉด ๋๋ค. ์ฌ์ฉ์๋ ์์ฒญ์์ ์ธ์ ID์ ํจ๊ป ์์ฒญ์ ์ ๋ฌํ๋ฉฐ, ์๋ฒ๋ ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.
์๋ฒ๋ ์ธ์ ์ ๋ณด๋ฅผ ํฐ์บฃ์ WAS, DB, ๋ฉ๋ชจ๋ฆฌ DB ๋ฑ์ ์ ์ฅํ ์ ์๋ค. ๋ฉ๋ชจ๋ฆฌ DB์๋ Redis ๋ฑ์ด ์๋ค.
โ๏ธ์ฟ ํค์ ์ธ์ ์ ๋น๊ต
์ฟ ํค๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๋ ์์ ๋ฐ์ดํฐ ํ์ผ์ด๋ค. ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋ค.
- ๋ณด์์ธก๋ฉด: ์ฟ ํค๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๋ฏ๋ก ํ์ทจ๋นํ๊ธฐ ์ฝ๋ค. ๋ฐ๋ผ์ ์ค์ํ ์ ๋ณด๋ฅผ ์ฟ ํค์ ์ ์ฅํ์ง ์๋ ๊ฒ์ด ์ข๋ค. ์๋ฅผ ๋ค์ด, ์ฟ ํค๋ XSS๊ณต๊ฒฉ(์น ์ฌ์ดํธ์ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ๋ ๊ณต๊ฒฉ)์ ํตํด์ ํ์ทจ๋นํ ์ ์๋ค. ์ฟ ํค์ ํ์ทจ๋ฅผ ๋ง๊ธฐ ์ํด์๋ HTTPOnly ์ต์ ์ ํตํด HTTP(S) ์์ฒญ์ ํตํด์๋ง ์ฟ ํค์ ์ ๊ทผํ ์ ์๊ฒ ํ ์ ์๋ค.
- ์ฉ๋์ธก๋ฉด: ์ฟ ํค๋ 4KB์ ํฌ๊ธฐ๋ก ๋น๊ต์ ์์ ์ฉ๋์ ๊ฐ์ง๋ค.
- ์๋์ ์ก: ๋์ผํ ์๋ฒ ์์ฒญ์์ ์ฟ ํค๋ ์๋์ผ๋ก ์์ฒญ์ ํฌํจ๋์ด ์ ์ก๋๋ค. ๋จ, ์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ์ ์๋์ฐ๋ณ๋ก ๊ด๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- ๊ธฐ๊ฐ์ค์ : ์ฟ ํค๋ ๋ง๋ฃ ๊ธฐ๊ฐ์ ์ค์ ํ ์ ์๋ค.
์ธ์ ์ ์ฟ ํค์ ๋น๊ตํ์ ๋ ์๋ฒ ์ธก์์ ๊ด๋ฆฌํ๋ฏ๋ก ๋ณด์์ฑ์ด ์ฐ์ํ๋ค.
โ๏ธ๊ธฐํ: ์ฟ ํค์ ์น ์คํ ๋ฆฌ์ง ๋น๊ต
์ฟ ํค์ ํ๊ณ
1. ์์ ์ฉ๋
2. ๋ถํ์ํ ํธ๋ํฝ ๋ฐ์: ์๋์ ์ก์ผ๋ก ์ธํ ๋ถํ์ํ ํธ๋ํฝ ๋ฐ์
3. ๋ธ๋ผ์ฐ์ ์ ์๋์ฐ๋ง๋ค ๋ ๋ฆฝ์ ์ธ ๊ฐ ์ ์ฅ ๋ถ๊ฐ
์น ์คํ ๋ฆฌ์ง
์ธ์ ์คํ ๋ฆฌ์ง: ๋ธ๋ผ์ฐ์ ์ ์๋์ฐ๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ์๋์ฐ๊ฐ ์ฌ๋ผ์ง๋ฉด ์๋ฉธ๋๋ ์ผ์์ ์ธ ์ ์ฅ์์ด๋ค.
๋ก์ปฌ ์คํ ๋ฆฌ์ด: ๋ธ๋ผ์ฐ์ ์ ์๋์ฐ๊ฐ ๊ณต์ ํ๋ฉฐ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ฐ๊ฐ ๋ซํ๋ ์ฌ๋ผ์ง์ง ์๋ ์๊ตฌ์ ์ธ ์ ์ฅ์์ด๋ค.
๐ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์์๋ ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋ฒ์์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ค๋ฉด, ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๋ค. ์ฌ์ฉ์๊ฐ ์ ์ํ๋ฉด ์๋ฒ๋ ๊ณ ์ ํ ํ ํฐ์ ๋ฐ๊ธํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๊ณ , ์ฌ์ฉ์๋ ์ด ํ ํฐ์ ๋งค ์์ฒญ๋ง๋ค ํฌํจํ์ฌ ์ ์กํ๋ค.
JWT(Json Web Token)์ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์ ์ค ํ๋๋ก, ์ฌ์ฉ์ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ฅผ JSON ํํ๋ก ์ํธํํ์ฌ ํ ํฐ ํํ๋ก ์ ๊ณตํ๋ ๋ฐฉ์์ด๋ค.
๐JWT
JWT๋ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ์ํจ JSON ํ ํฐ์ด๋ค. JWT ๊ธฐ๋ฐ ์ธ์ฆ์ JWT ํ ํฐ(Access Token)์ HTTP ํค๋์ ์ค์ด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ๋ฐฉ์์ด๋ค.
JWT๋ JSON ๋ฐ์ดํฐ๋ฅผ Base64 URL-safe Encode๋ฅผ ํตํด ์ธ์ฝ๋ฉํ์ฌ ์ง๋ ฌํํ ๊ฒ์ด๋ค. ํ ํฐ ๋ด๋ถ์๋ ์๋ณ์กฐ ๋ฐฉ์ง๋ฅผ ์ํด ๊ฐ์ธํค๋ฅผ ํตํ ์ ์์๋ช ์ด ๋ค์ด์๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ JWT๋ฅผ ์๋ฒ๋ก ์ ์กํ๋ฉด ์๋ฒ๋ ์๋ช ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ฉฐ ๊ฒ์ฆ์ด ์๋ฃ๋๋ฉด ์์ฒญํ ์๋ต์ ๋๋ ค์ค๋ค.
JWT๋ .๋ฅผ ๊ตฌ๋ถ์๋ก ๋๋์ด์ง๋ ์ธ ๊ฐ์ง ๋ฌธ์์ด์ ์กฐํฉ๋๋ค. .๋ฅผ ๊ธฐ์ค์ผ๋ก Header, Payload, Signature๋ก ๋๋์ด์ง๋ค. Header์๋ JWT์์ ์ฌ์ฉํ ํ์ ๊ณผ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ๊ฐ ๋ด๊ฒจ์์ผ๋ฉฐ, Payload๋ ์๋ฒ์์ ์ฒจ๋ถํ ์ฌ์ฉ์์ ๊ถํ ์ ๋ณด์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ ์๋ค. ๋ง์ง๋ง์ผ๋ก Signature์๋ Header, Payload๋ฅผ Base64 URL-safe Encode๋ฅผ ํ ์ดํ Header์ ๋ช ์๋ ํด์ํจ์๋ฅผ ์ด์ฉํ๊ณ , ๊ฐ์ธํค(Private Key)๋ก ์๋ช ํ ์ ์์๋ช ์ด ๋ด๊ฒจ์๋ค.
โ๏ธAccess Token์ ํ๊ณ
โ์ฌ์ฉ์์ ์ฆ์ ๋ก๊ทธ์์ ๊ฒฝํ, ๋ณด์ ๋ฌธ์
Access Token์ ๋ฐ๊ธ ์ดํ Token ์์ฒด๋ก ์ฌ์ฉ์ ๊ถํ์ ์ธ์ฆํ๋ค. ์ด๋, Access Token์ด ํ์ทจ๋๋ฉด ํ ํฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง ํ ํฐ์ ํ๋ํ ์ฌ๋์ ๋๊ตฌ๋ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ค. Token ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒ ํ๋ ๊ฒ์ Token ํ์ทจ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ๋ ์ ์์ง๋ง, Token ์ ํจ ๊ธฐ๊ฐ์ ์งง๊ฒ ํ๋ฉด ๊ทธ๋งํผ ์ฆ์ ๋ก๊ทธ์์์ผ๋ก ์ธํด ์ฌ์ฉ์๊ฐ ๋ถํธํด์ง๋ค.
โ๏ธRefresh Token์ ๋์
๋ชฉ์
Refresh Token์ ๋ชฉ์ ์ Access Token์ ์ ํจ ๊ธฐ๊ฐ์ ์งง๊ฒ ๋ง๋ค์ด ๋ณด์์ ๊ฐํํ๋ฉด์๋ ์ฌ์ฉ์๊ฐ ์ฆ์ ๋ก๊ทธ์์ ๊ฒฝํ์ ํ์ง ์๋๋ก ํจ์ ์๋ค.
Access Token์ด ๋ฆฌ์์ค์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ Token์ด๋ผ๋ฉด, Refresh Token์ ๊ธฐ์กด ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ณ ์๋ Access Token์ด ๋ง๋ฃ๋์์ ๋ Access Token์ ์๋ก ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ๋๋ Token์ด๋ค.
์ ํจ๊ธฐ๊ฐ
Refresh Token์ Access Token ๋๋น ๊ธด ์ ํจ ๊ธฐ๊ฐ์ ๊ฐ๋๋ค. Refresh Token์ ์ฌ์ฉํ๋ ์ํฉ์์๋ ์ผ๋ฐ์ ์ผ๋ก Access Token์ ์ ํจ๊ธฐ๊ฐ์ 30๋ถ ์ด๋ด Refresh Token์ ์ ํจ๊ธฐ๊ฐ์ 2์ฃผ ์ ๋๋ก ์ค์ ํ๋ค๊ณ ํ๋ค. ๋น์ฐํ ์๋น์ค ์ฑ๊ฒฉ์ ๋ฐ๋ผ ์ ์ ํ ์ ํจ๊ธฐ๊ฐ์ ์ค์ ํด์ผ ํ๋ค.
ํ๊ณ
Refresh Token ๋์ ์ ํตํด Access Token์ ์ ํจ์๊ฐ์ ์งง๊ฒ ๋ง๋ค์์ง๋ง ์งง์ ์ ํจ ์๊ฐ๋์ Access Token์ด ํ์ทจ๋นํ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ๋ํ Refresh Token์ด ํ์ทจ๋นํ๋ค๋ฉด ๊ณต๊ฒฉ์๋ Access Token์ ๋ฐ๊ธ๋ฐ์ ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์กด์ฌํ๋ค.
๐JWT๋ฅผ ํตํ ์ธ์ฆ ์ ์ฐจ(with Access Token, Refresh Token)
[ํ๋ก ํธ์๋]: ๋ฐฑ์๋์ ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ฌํ๋ค.
[๋ฐฑ์๋]: ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ฒ์ฆํ๊ณ Access Token๊ณผ Refresh Token, Access Token์ ๋ง๋ฃ์๊ฐ์ ๋ฐํํด์ค๋ค. ์ด๋ ์์ฑํ Refresh Token์ DB์ {ID, Refresh Token}์ผ๋ก ์ ์ฅํ๋ค.
[ํ๋ก ํธ์๋]: ๋ฐํ๋ฐ์ Access Token์ ๋งค api ํธ์ถ๋ง๋ค ํค๋์ ๋ถ์ฌ์ ์ ์กํ๋ค.
[๋ฐฑ์๋]: api ํธ์ถ์ ํค๋์ Access Token์ ํ์ธํ๊ณ ์ ํจํ์ง, ๋ง๋ฃ๊ธฐ๊ฐ์ด ์ง๋ฌ๋์ง๋ฅผ ํ์ธ ํ api๋ฅผ ๋์์ํจ๋ค.
[ํ๋ก ํธ์๋]: Access Token์ ๋ง๋ฃ ๊ธฐ๊ฐ์ด ์ง๋ฌ๋ค๋ฉด ๋ฐฑ์๋์ Refresh Token์ผ๋ก Access Token์ ์ฌ์์ฒญํ๋ค.
[๋ฐฑ์๋]: Refresh Token์ด DB์ ์๋์ง ํ์ธ ํ, ๋ง๋ค๋ฉด Access Token๊ณผ ์๋ก์ด Access Token ๋ง๋ฃ ์๊ฐ์ ๋ฐํํ๋ค.
[ํ๋ก ํธ์๋]: ์๋ก ๋ฐ๊ธ๋ฐ์ Access Token์ ๋งค api ํธ์ถ๋ง๋ค ํค๋์ ๋ถ์ฌ์ ์ ์กํ๋ค.
โจ์ฐธ๊ณ
https://hudi.blog/refresh-token/
'๐ป์น(Web)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React]์ด๊ธฐ์ธํ (0) | 2024.07.18 |
---|---|
MVC, MVVM, Flux ํจํด (1) | 2024.07.15 |
[React]React Router (0) | 2024.06.28 |
ํ๋ก ํธ์๋ ์ฑ๋ฅ ์ต์ ํ (0) | 2024.04.12 |
์ผ๋ฐ์ ์ผ๋ก GET ์์ฒญ์๋ Request Body๋ฅผ ์์ฒญํ ์ ์๋ค! (0) | 2023.08.24 |