JWT (JSON Web Token) ์ด๋
JWT(JSON Web Token)์ด๋ ์ ์ ๋ฅผ ์ธ์ฆํ๊ณ ์๋ณํ๊ธฐ ์ํ JSON ํ ํฐ์ ์๋ฏธํฉ๋๋ค.
์ด ํ ํฐ ๋ด์๋ ์ฌ์ฉ์์ ๊ถํ ์ ๋ณด์ ๊ฐ์ ์ธ์ฆ ์ ๋ณด๊ฐ Base64 URL ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉ๋์ด ํฌํจ๋์ด ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ HTTP ํค๋์ ์ค์ด ์๋ต์ ๋ณด๋ด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๊ณ ์ธ์ฆ/์ธ๊ฐ๋ฅผ ์ํํฉ๋๋ค.
JWT ๊ตฌ์กฐ
JWT๋ ์ธ ํํธ๋ก ๋๋์ด์ง๋ฉฐ, ๊ฐ ํํธ๋ ์ ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
ํค๋(Header), ํ์ด๋ก๋(Payload), ์๋ช (Signature)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.

ํค๋(Header)
ํค๋์๋ ํด์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ ํฐ ํ์ ์ ๋ณด๊ฐ ์์ต๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ: ์๋ช
์์ฑ์ ์ฌ์ฉํ ์๊ณ ๋ฆฌ์ฆ ์ข
๋ฅ
- ex) HS256, RS256
- ํ์ : ํ ํฐ์ ํ์ , ์ฌ๊ธฐ์๋ JWT๊ฐ ๋์ฃ .
ํ์ด๋ก๋(Payload)
ํ์ด๋ก๋์๋ ํ ํฐ์ ๋ด๊ธธ, ์๋ฒ์ ํด๋ผ์ด์ธํธ์์ ์ฃผ๊ณ ๋ฐ๊ณ ์ ํ๋ ์ค์ ์ ๋ณด๋ค์ด ์์ต๋๋ค.
์ ๋ณด ํ๋๋ฅผ 'ํด๋ ์(claim)'์ด๋ผ๊ณ ํฉ๋๋ค.
- ํด๋ ์: key(name)-value ํ์์ผ๋ก ์ด๋ฃจ์ด์ง ํ ์์ ์ ๋ณด
- ํด๋ ์ ์์
- ํ์ค ํด๋ ์(Registered Claim): JWT ์ฌ์์์ ์ ์ํ ํด๋ ์
- iss(issuer: ๋ฐํ์)
- exp(expiration time: ๋ง๋ฃ ์๊ฐ)
- sub(subject: ์ ๋ชฉ)
- iat(issue at: ๋ฐํ ์๊ฐ)
- jti(JWT ID)
- ๊ณต๊ฐ ํด๋ ์(Public Claim): ์ฌ์ ์ ์ ์๋, ๊ณต๊ฐ์ฉ ์ ๋ณด ์ ๋ฌ์ ์ํ ํด๋ ์
- ๋น๊ณต๊ฐ ํด๋ ์(Private Claim): ๋ฐ๊ธ์์ ์์ ์ ๊ฐ์ ํ์์ ๋ฐ๋ผ ์ ์๋ ํด๋ ์
- ํ์ค ํด๋ ์(Registered Claim): JWT ์ฌ์์์ ์ ์ํ ํด๋ ์
์๋ช (Signature)
์๋ช ์ ํค๋์ ํ์ด๋ก๋๋ฅผ ์ด์ด ๋ถ์ธ ํ, ์ํฌ๋ฆฟ(Secret Key) ๋๋ ํ๋ผ์ด๋น ํค(Private Key)๋ก ์ํธํํ ๊ฐ์ ๋๋ค.
์ํธํ๋ ํค๋์์ ์ ์ํ ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ ํค(Key)๋ ์๋ฒ์์๋ง ๊ฐ๊ณ ์๋ ๊ฐ์ผ๋ก ์ด ๋น๋ฐํค๊ฐ ์ ์ถ๋์ง ์๋ ์ด์ ํ์ธ์ด ๋ณตํธํํ ์ ์์ต๋๋ค.
์๋ช ์ ํค๋์ ํ์ด๋ก๋์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ์์กฐํ์ง ์์์์ ์๋ฒ๊ฐ ์๋ช ์ ๊ฒ์ฆํ์ฌ ํ์ธํ ์ ์๊ฒ ํด์ค๋๋ค.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
+ JWT ์์
JWT๋ Base64URL๋ก ์ธ์ฝ๋ฉ์ด ๋์ด ์์ต๋๋ค.
Base64URL์ ์น(URL) ํ๊ฒฝ์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก
๋๊ตฌ๋ ๋์ฝ๋ฉํ ์ ์์ด ์ํธํ์ ๊ธฐ๋ฅ์ ์์ต๋๋ค.
https://jwt.io/์์ JWT Decoder / Encoder ์ฒดํ์ ํ ์ ์์ต๋๋ค.

JWT ๋์ ๋ฐฉ์

- ์ฌ์ฉ์๋ ์์ด๋/๋น๋ฐ๋ฒํธ ๋ฑ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ๋ ฅํด ์๋ฒ๋ก ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์๋ฒ๋ ์
๋ ฅ๋ฐ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ , ์ธ์ฆ์ด ์ฑ๊ณตํ๋ฉด JWT๋ฅผ ์์ฑํฉ๋๋ค.
- ํค๋์ ํ์ด๋ก๋๋ฅผ ์ ์ํ๊ณ , ์ํฌ๋ฆฟ ํค์ ํ์ด๋ก๋๋ฅผ ํค๋์ ์ ์๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํํ์ฌ ์๋ช ์ ๋ง๋ญ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ JWT๋ฅผ ์ ์ฅํฉ๋๋ค(๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋ฑ). ์ดํ ์์ฒญ ์ HTTP ํค๋ Authorization์ ๋ค์๊ณผ ๊ฐ์ด JWT๋ฅผ ๋ด์ ๋ณด๋
๋๋ค.
- Authorization: Bearer <JWT>
- ์๋ฒ๋ ํ ํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํฉ๋๋ค.
- ์๋ช ์ด ์ ํจํ์ง, ๋ง๋ฃ ์๊ฐ์ด ์ง๋์ง ์์๋์ง
- ์๋ฒ๋ ํ์ด๋ก๋์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
- ์๋ฒ๋ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์๋ต์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํฉ๋๋ค.
JWT ์ฅ๋จ์
โ ์ฅ์
- ์ธ์
์ ์ฅ์ ๋ถํ์ (Stateless)
- JWT ์์ฒด๊ฐ ์ธ์ฆ๋ ์ ๋ณด๋ฅผ ํฌํจํ๋ฏ๋ก, ์ธ์ ์ ์ฅ์ ๊ฐ์ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์ ์์ต๋๋ค.
- ๋ฐ๋ผ์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ๊ธฐ์ตํ์ง ์๋ ๋ฌด์ํ(stateless) ๊ตฌ์กฐ๋ก ๋์ํ ์ ์์ต๋๋ค.
- ์๋ฒ ํ์ฅ์ ์ ๋ฆฌ
- ๋ฌด์ํ ์ํคํ ์ฒ ๋๋ถ์, ์๋ฒ ๊ฐ ์ธ์ ๊ณต์ ๊ฐ ํ์ ์์ด ํ์ฅ์ ์ ํฉํฉ๋๋ค.
- ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ์ธ์ฆ ์ ๋ณด๊ฐ ํ์ด๋ก๋์ ํฌํจ๋์ด ์์ด, ์์ฒญ ์๋ง๋ค DB๋ฅผ ์กฐํํ์ง ์์๋ ๋ฉ๋๋ค.
- ๋น๋ฐ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ช ์ ์์ฑํ๋ฏ๋ก ๋ฐ์ดํฐ ์๋ณ์กฐ๋ฅผ ๋ง์ ์ ์์ต๋๋ค.
๐ฅ ๋จ์
- ํ ํฐ ์์ฒด์ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์์ผ๋ฏ๋ก, ํ ํฐ ํ์ทจ ์ ์ํํ ์ ์์ต๋๋ค.
- ํ ํฐ์ ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ ํ์ทจ๋นํ๋ฉด ๋์ฒํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ์ด๋ฏธ ๋ฐ๊ธ๋ ํ ํฐ์ ์ค๊ฐ์ ๊ฐ์ ๋ก ๋ฌดํจํํ๊ธฐ ํ๋ญ๋๋ค.
- ํ์ด๋ก๋์ ๋ง์ ์ ๋ณด๋ฅผ ๋ด์ ํ ํฐ์ด ๊ธธ์ด์ง๋ฉด ๋คํธ์ํฌ ์ฑ๋ฅ์ ๋ถ๋ด์ด ๋ ์ ์์ต๋๋ค.
- ํ ํฐ ๋ง๋ฃ ์๊ฐ ๋๋ ๋ง
- ๋๋ฌด ์งง์ผ๋ฉด ์ฆ์ ์ฌ๋ฐ๊ธ์ผ๋ก ๋ถํธํ๊ณ
- ๋๋ฌด ๊ธธ๋ฉด ํ์ทจ ์ ์ฅ๊ธฐ๊ฐ ์ ์ฉ๋ ์ ์์ด ์ ๋นํ ๊ท ํ์ก์์ผ ํฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
https://ivory-room.tistory.com/88
https://research.securitum.com/jwt-json-web-token-security/
https://www.geeksforgeeks.org/json-web-token-jwt/