JWT
- RFC 7519
- ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์. ์๋ฒ์ ๋ฌด์ํ์ฑ, ํ์ฅ์ฑ, ๋ณด์์ฑ์ ํ๋ณดํ ์ ์๋ค.
๊ตฌ์กฐ
- Header, Payload, Signature ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋จ.
- ์ธ ๋ถ๋ถ์
.
์ผ๋ก ๊ตฌ๋ถํ๋ค. (xxxxx.yyyyy.zzzzz
)
Header
- ํ ํฐ์ ํ์
, ์๋ช
์๊ณ ๋ฆฌ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ๋ JSON ํฌ๋งท:
{ "alg": "HS256", "typ": "JWT" }
- Base64Url๋ก ์ธ์ฝ๋ฉ๋์ด JWT์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ผ๋ก ๋ค์ด๊ฐ๋ค.
Payload
- ํ์ด๋ก๋๋ ํด๋ ์๋ค์ ๊ฐ์ง JSON ํฌ๋งท:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
- ํด๋ ์์ ์ํฐํฐ(์ ์ )์ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ์ ๋ํ ์ํ.
- ์ธ ๊ฐ์ง ์ข
๋ฅ์ ํด๋ ์์ด ์๋ค:
- registered claims: ํ์๋ ์๋์ง๋ง ๊ถ์ฅ๋๋ค:
- iss(issuer)
- exp(expiration time)
- sub(subject)
- aud(audience)
- others
- public claims: URI ํ์์ผ๋ก ์ถฉ๋์ด ๋ฐฉ์ง๋ ์ด๋ฆ์ ๊ฐ์ ธ์ผ ํ๋ค.
- private claims: ์ปค์คํ ํด๋ ์. ์์ธก ์ฌ์ด์ ํฉ์๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ค.
- registered claims: ํ์๋ ์๋์ง๋ง ๊ถ์ฅ๋๋ค:
- Base64Url๋ก ์ธ์ฝ๋ฉ๋์ด JWT์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ผ๋ก ๋ค์ด๊ฐ๋ค.
Signature
- ์ธ์ฝ๋ฉ๋ ํค๋์ ํ์ด๋ก๋, ์ํฌ๋ฆฟ์ ํค๋์ ๋ช
์๋ ์๋ช
์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ธ์ฝ๋ฉํ ๋ฌธ์์ด:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
- Base64Url๋ก ์ธ์ฝ๋ฉ๋์ด JWT์ ์ธ ๋ฒ์งธ ๋ถ๋ถ์ผ๋ก ๋ค์ด๊ฐ๋ค.
ํฉ์น๊ธฐ
- ํค๋, ํ์ด๋ก๋, ์๊ทธ๋์ฒ๋ฅผ
.
์ ๊ตฌ๋ถ์๋ก ๋ชจ๋ ํฉ์น๋ฉด ํ๋์ JWT๊ฐ ๋๋ค.
๋์ ๋ฐฉ์
- ๊ธฐ์กด ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ์ ๊ฒฝ์ฐ ์๋ฒ๊ฐ ์ธ์
์ ๋ณด๋ฅผ ๋ค๊ณ ์์ด์ผ ํ๋ค:sequenceDiagram participant S as Server participant C as Client S->>C: ์น ํ์ด์ง C->>S: ๋ก๊ทธ์ธ ์์ฒญ Note left of S: ์ธ์ ์์ฑ S->>C: ๋ก๊ทธ์ธ ์๋ต C->>S: ์์ฒญ Note left of S: ์ธ์ ์ ์ฅ์ ์กฐํ S->>C: ์๋ต
- ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆํ๋ฉด ์๋ฒ๊ฐ ํ ํฐ์ ์ ํจ์ฑ๋ง ๊ฒ์ฆํ๋ค:
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ณดํธ๋ ์์์ ์ ๊ทผํ๋ ค๋ฉด ์์ฒญ์ JWT๋ฅผ ๋ด์ ๋ณด๋ธ๋ค:
Authorization: Bearer <token>
- ์๋ฒ๋ ์์ฒญ์ Authorization ํค๋์ ๋ด๊ธด JWT์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๊ณ ์๋ตํ๋ค.
sequenceDiagram participant S as Server participant C as Client S->>C: ์น ํ์ด์ง C->>S: ๋ก๊ทธ์ธ ์์ฒญ Note left of S: ํ ํฐ ์์ฑ S->>C: ๋ก๊ทธ์ธ ์๋ต Note right of C: ํ ํฐ ์ ์ฅ Note right of C: ํ ํฐ ์ฝ๊ธฐ C->>S: ํ ํฐ๊ณผ ํจ๊ป ์์ฒญ Note left of S: ํ ํฐ ๊ฒ์ฆ S->>C: ์๋ต - ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ณดํธ๋ ์์์ ์ ๊ทผํ๋ ค๋ฉด ์์ฒญ์ JWT๋ฅผ ๋ด์ ๋ณด๋ธ๋ค: