
๐ JWT๋
JWT (Json Web Token)์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์ ์ธ์ฆ (Authentication)๊ณผ ๊ถํ ๋ถ์ฌ (Authorization)๋ฅผ ์ํด ์ฌ์ฉ๋๋ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์ด๋ค.
์ด ํ ํฐ์ ํด๋ผ์ด์ธํธ-์๋ฒ ๊ฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๊ตํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ,
ํนํ HTTP ํค๋๋ฅผ ํตํด ์ ๋ฌ ๊ฐ๋ฅํ๊ณ , ์์ฒด์ ์ผ๋ก ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์๋ค๋ ์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ค.
JWT๋ ๊ทธ ์์ฒด๋ก ๋์งํธ ์๋ช ์ด ํฌํจ๋ JSON ๊ฐ์ฒด์ด๋ฉฐ, ์ธ์ ์์ด ์ธ์ฆ ์ํ๋ฅผ ์ ์งํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค.
๐ JWT์ ์ ์
๊ณต์ ๋ช ์ธ๋ฅผ ํตํด ์กฐ๊ธ ๋ ์์ธํ ์ดํด๋ณด๋ฉด, JWT๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋๋ค.
A compact, URL-safe means of representing claims to be transferred between two parties.
์ฆ, ๋ ์ฃผ์ฒด ์ฌ์ด์์ ํด๋ ์ (Claims)์ ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํ ์๊ณ , URL-safeํ ๋ฐฉ๋ฒ์ด๋ผ๋ ๋ป์ด๋ค.
์ฌ๊ธฐ์์ ๋งํ๋ ํด๋ ์(Clamis)์ ์ฌ์ฉ์ ID, ๊ถํ, ํ ํฐ ๋ง๋ฃ ์๊ฐ ๋ฑ์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ฐ์ดํฐ ์งํฉ์ ์๋ฏธํ๋ค.
JWT๋ ์ผ๋ฐ์ ์ผ๋ก ์๋์ ๊ฐ์ด ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
xxxxx.yyyyy.zzzzz
์ด ์ธ ๋ถ๋ถ์ ๊ฐ๊ฐ ๋ค์์ ํ์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.
| ๊ตฌ์ฑ ์์ | ์ค๋ช |
| Header | ํ ํฐ์ ํ์ ๊ณผ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ ์ ๋ณด |
| Payload | ์ฌ์ฉ์ ์๋ณ ์ ๋ณด ๋ฐ ํด๋ ์์ ํฌํจํ ๋ณธ๋ฌธ ๋ฐ์ดํฐ |
| Signature | ํ ํฐ์ด ๋ณ์กฐ๋์ง ์์์์ ์ฆ๋ช ํ๋ ์๋ช ๊ฐ |
์ต์ข ์ ์ผ๋ก, ๊ฐ๊ฐ Base64Url ์ธ์ฝ๋ฉ๋์ด์ . (dot) ์ผ๋ก ์ฐ๊ฒฐ๋ ํ๋์ ๋ฌธ์์ด์ด ๋๋ค.
๐งฑ ๊ตฌ์ฑ ์์ ์์ธ ๋ถ์
1๏ธโฃ Header
{
"alg": "HS256",
"typ": "JWT"
}
- alg: ํด์ฑ ์๊ณ ๋ฆฌ์ฆ (ex. HS256, RS256 ๋ฑ)
- typ: ํ ํฐ ํ์ (JWT)
์ด ํค๋๋ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ์๋ช ํ ์ง์ ๋ํ ๋ฉํ๋ฐ์ดํฐ์ด๋ค.
2๏ธโฃ Payload
{
"sub": "user123",
"name": "์์ฐ",
"role": "ADMIN",
"exp": 1750600000
}
Payload๋ ์ค์ ๋ก ํ ํฐ์ด ๋ด๊ณ ์ถ์ ํด๋ ์ (Claims)์ ์งํฉ์ด๋ค.
๊ทธ๋ฆฌ๊ณ , ์ด๋ฌํ ํด๋ ์์ ํฌ๊ฒ ๋ค์ ์ธ ๊ฐ์ง๋ก ๋ถ๋ฅ๋๋ค.
- Registered claims (ํ์ค ํด๋ ์): iss, exp, sub, aud ๋ฑ
- Public claims (๊ณต๊ฐ ํด๋ ์): ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํด URI๋ก ๋ค์์คํ์ด์ค ๋ถ์ฌ ํ์
- Private claims (์ฌ์ค ํด๋ ์): ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋ ์์ ์ธ ๊ท์น
โ ๏ธ ์ฃผ์์ฌํญ
์ด๋, Payload๋ ์ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๋ ์ง ํ ํฐ์ ๋์ฝ๋ฉํด์ ๋ด๋ถ ์ ๋ณด๋ฅผ ์ด๋ํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ์ ๋ Payload์ ํฌํจํด์๋ ์๋๋ค.
3๏ธโฃ Signature
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
์๋ช ์ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ์์กฐํ๋๋ผ๋, ์๋ช ์ด ์ผ์นํ์ง ์์ผ๋ฉด ์๋ฒ๋ ์ด๋ฅผ ๊ฒ์ฆ ์คํจ๋ก ๊ฐ์ฃผํ์ฌ ๊ฑฐ๋ถํ๋ค.
โ๏ธ ์ JWT๋ฅผ ์ฌ์ฉํ ๊น?
JWT๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ํ์ ์ผ๋ก ๋ค์์ ๋ค ๊ฐ์ง๊ฐ ์๋ค.
- ์ธ์ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ์ง ์์ (Stateless): ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ๊ธฐ์ตํ์ง ์์๋ ๋ผ์ ํ์ฅ์ฑ(Scalability) ์ฉ์ด
- ๋ค์ํ ํ๊ฒฝ์ ์ ์ฐํจ: HTTP ํค๋, ์ฟ ํค, ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ ๋ฌ ๊ฐ๋ฅ
- Cross-Origin ์ง์: RESTful API ๋ฑ CORS ํ๊ฒฝ์ ์ ๋ฆฌ
- ์๋ช ๊ธฐ๋ฐ ๊ฒ์ฆ์ผ๋ก ์๋ณ์กฐ ๋ฐฉ์ง
๐ JWT์ OAuth์ ์ฐจ์ด์
๋ง์ ๊ฐ๋ฐ์๋ค์ด JWT์ OAuth๋ฅผ ํผ๋ํ๋๋ฐ,
Oauth๋ ์ธ์ฆ ๋ฐฉ์์ด๊ณ , JWT๋ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด๋ ํ์์ด๋ค.
์ด๋ฌํ JWT๋ OAuth์ ์ก์ธ์ค ํ ํฐ ํฌ๋งท ์ค ํ๋๋ก ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค.
๐ง ๊ฒฐ๋ก
JWT๋ ๋จ์ํ๋ฉด์๋ ๊ฐ๋ ฅํ ์ธ์ฆ ๋งค์ปค๋์ฆ์ด๋ค.
๊ธฐ์กด์ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์ด ์๋ฒ์ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด์๋ค๋ฉด,
JWT๋ ํ ํฐ ๊ทธ ์์ฒด์ ๋ชจ๋ ์ํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฐฉ์์ด๋ค.
์ด๋ฅผ ํตํด ์๋ฒ๋ ๋ฌด์ํ(stateless)๋ก ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ,
์ด๋ ๋ถ์ฐ ์์คํ , ๋ง์ดํฌ๋ก์๋น์ค, ์๋ฒ๋ฆฌ์ค ์ํคํ ์ฒ ๋ฑ์์ ๋์ฑ ๋น์ ๋ฐํ๋ค.
'๐ป๊ณต๋ถ ๊ธฐ๋ก > ๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Backend] RedisTemplate (1) | 2025.06.28 |
|---|---|
| [Backend] Redis TTL + JWT (0) | 2025.06.22 |
| [Backend] Java 17 VS Java 21 (2) | 2025.06.17 |
| [Backend] CI ์ค์ ์์ distribution (0) | 2025.06.17 |
| [Backend] Listํ ๋ช ๋ น์ด (0) | 2025.01.12 |