๐ฅธ JWT(Json Web Token)
JWT๋ ์ ์ ๋ฅผ ์ธ์ฆํ๊ณ ์๋ณํ๊ธฐ ์ํ Token ๊ธฐ๋ฐ ์ธ์ฆ์ด๋ค.
ํ ํฐ ์์ฒด์ ์ฌ์ฉ์์ ๊ธฐ๋ณธ ์ ๋ณด ๋๋ Auth๊ฐ ํฌํจ๋๋ค.
JWT์ ๊ตฌ์กฐ
JWT๋ Header, Payload, Signature๋ก ๊ตฌ์ฑ๋๋ค.
๊ฐ ์์๋ .์ผ๋ก ๊ตฌ๋ถ๋๋ค.
Header
JWT์์ ์ฌ์ฉํ Type(typ)๊ณผ ํด์ ์๊ณ ๋ฆฌ์ฆ(alg)์ ์ข ๋ฅ๊ฐ ๋ด๊ฒจ์๋ค.
1
2
3
4
{
"typ":"JWT",
"alg":"HS256"
}
Payload
์๋ฒ์์ ์ ๋ฌํด์ค ์ฌ์ฉ์์ ์ ๋ณด ๋ฐ์ดํฐ(Claim)๋ฅผ ์ ์ฅํ๋ค.
Claim์ Key:Valueํํ๋ก ๊ฐ์ ๊ฐ์ง๋ค. ์ ์ฅ๋๋ ์ ๋ณด์ ๋ฐ๋ผ Registered Claims, Public Claims, Private Claims๋ก ๊ตฌ๋ถ๋๋ค.
Registered Claims
1
2
3
4
5
6
7
iss : ํ ํฐ ๋ฐ๊ธ์ (issuer)
sub : ํ ํฐ ์ ๋ชฉ (subject)
aud : ํ ํฐ ๋์์ (audience)
exp : ํ ํฐ ๋ง๋ฃ ์๊ฐ (expiration)
nbf : ํ ํฐ ํ์ฑ ๋ ์ง (not before), ์ด ๋ ์ด ์ง๋์ง ์์ผ๋ฉด ํ์ฑํ๋์ง ์๋๋ค.
iat : ํ ํฐ ๋ฐ๊ธ ์๊ฐ (issued at)
jti : JWT ํ ํฐ ์๋ณ์ (JWT ID)
Public Claims
Public Claims๋ ์ถฉ๋์ด ๋ฐฉ์ง๋์ด์ผํ๋ค.
์ฃผ๋ก URI ํ์์ผ๋ก ์ง๋๋ค.
1
"https://munprooo.github.io/jwt/public":true
Private Claims
ํด๋ผ์ด์ธํธ์ ์๋ฒ ํ์ํ์ ์ฌ์ฉ๋๋ ํด๋ ์์ด๋ค. Public๊ณผ๋ ๋ฌ๋ฆฌ ์ด๋ฆ์ด ์ค๋ณต๋ ์ ์์ผ๋ฏ๋ก ์ถฉ๋์ ์ ์ํด์ผ ํ๋ค.
Signature
Header์ Payload๋ฅผ Base64๋ก ์ธ์ฝ๋ฉ ํ, Header์ ๋ช
์๋ ํด์ํจ์๋ฅผ ์ ์ฉํ๊ณ , ๊ฐ์ธํค๋ก ์๋ช
ํ ์ ์์๋ช
์ด ๋ด๊ฒจ์๋ค.
ํด๋น ๊ฐ์ Header์ Payload๊ฐ ๋ณ์กฐ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
SigningKey๋ฅผ ์๋ฒ์์ ๊ณ ์ ํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ์ธ๋ถ์์ ๋์ ์ผ๋ก ๋ฐ์์ค๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์๋ฒ์์ ๊ณ ์
- ์ฝ๋๋ก ๊ณ ์
์ธ๋ถ์์ ๋์ ์ผ๋ก ๋ฐ์์ค๊ธฐ
- ํ๊ฒฝ ๋ณ์๋ก ์ค์
- Config๋ฑ ํ์ผ์์ ์ฝ์ด์ค๊ธฐ
- ์ธ๋ถ ์๋น์ค ํธ์ถ (API ๋ฑ)
๐ Conclusion
์ธ์
์ ํตํ ์ฌ์ฉ์์ ์ธ์ฆ์ ํ๋ค๋ฉด, ์๋ฒ์์ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ก์ ์ ์ฅํ๊ณ ๊ฐ ์ฌ์ฉ์์ ์์ฒญ๋ง๋ค ์ธ์
ID๋ฅผ ํตํด ์ธ์ฆ์ ํ์ธํ๋ค.
์ด ๊ฒฝ์ฐ, ์๋ฒ๊ฐ ์ฌ๋ฌ ๋๋ผ๋ฉด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ธ์
์ DB์ ์ ์ฅํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ์ง๋ง ๋ฆฌ์์ค์ ๋ญ๋น๊ฐ ์๊ธด๋ค.
JWT์ ๊ฐ์ ํ ํฐ์ ํด๋ผ์ด์ธํธ์ ์ ์ฅํ๋ฉด HTTP ํค๋์ ํ ํฐ์ ์ฒจ๋ถํด์ ์์ฒญํ๋ฉด ์๋ฒ์์ ํ ํฐ์ ์ฌ๋ถ๋ง ํ๋ณํ๋ฉด ๋๋ค.
์๋ฒ๊ฐ ์ฌ๋ฌ ๋ ์๋๋ผ๋, ์ฌ์ฉ์๊ฐ ๋ณธ์ธ์ ์ธ์ฆ,์ธ๊ฐ๋ฅผ ์ฆ๋ช
ํ ์ ์์ด ๊ด๋ฆฌ๊ฐ ํธ๋ฆฌํด์ง๋ค.
์ด ๋ฐฉ์์ MSA์์ ๋น์ ๋ฐํ๋ค.
๊ฐ ์๋น์ค๋ง๋ค ์์ฒด์ ์ธ ์๋ฒ์ด๋ฏ๋ก JWT๋ฐฉ์์ ์ฐ๋ฉด ๋ณต์กํ ์ธ์
๊ด๋ฆฌ๊ฐ ํ์ ์์ด ํ ํฐ์ ์ ํจ์ฑ๋ง ๊ฒ์ฆํ๋ฉด ๋๋ค.