JAN's History
JWT의 구조 이해하기 본문
JWT란?
RFC 7519 웹 표준으로 지정 되어 있고,
Json 을 사용해서 토큰 자체에 정보들을 저장 하고 있는 Web Token이라고 정의 된다.
기본적으로 HTTP protocl은 Stateless 상태인데, 이 특징을 유지하면서도 로그인 상태 유지를 가능하게 해주는 것이 JWT토큰이다!
RFC 7519
https://www.rfc-editor.org/rfc/rfc7519
RFC 7519: JSON Web Token (JWT)
www.rfc-editor.org
JWT 공식 사이트
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
JWT (Json Web Token)의 구성
Header, Payload, Signature 로 .을 구분자로 나누어지는 3개의 부분으로 구성되어 있다.
xxxxx.yyyyy.zzzzz
(색깔 별로 구분해서 보자)
Header : Signature를 해싱하기 위한 알고리즘 정보가 담긴다.
-> 위 예시에서는 HS256 알고리즘
alg : 정보를 암호화할 해싱 알고리즘
typ : 토큰의 타입
Payload : 서버와 클라이언트가 주고 받는, 시스템에서 실제로 사용될 정보에 대한 내용들이 담긴다.
주로 클라이언트의 고유 ID, 유효 기간 등이 포함
참고로 key-value 형식으로 이루어진 한쌍의 정보를 Claim 이라고 말해요.
등록된 클레임
- iss(발급자)
- exp(만료시간)
- sub(제목)
- aud(대상)
- 등등.
Signature : Base64Url로 인코딩 된 header, payload, 시크릿 키를 가지고 HMAC256 알고리즘으로 암호화를 한 것입니다.
-> 해당 문자열을 통해 서버에서 해당 토큰이 유효한 토큰인지 위변조를 검증해요
JWT의 구조
BASE64(헤더).BASE64(페이로드).
BASE64(HS256암호화(lowSig))
클라이언트 - 서버 간의 JWT 생성 방식
1. 클라이언트에서 로그인 요청
2. 서버는 검증 후 클라이언트 고유 ID 등의 정보를 payload 에 담는다.
3. 서버는 암호화할 비밀키를 사용하여 Access Token (JWT) 를 발급 후, 클라이언트에 전달한다.
(이때, 서버는 JWT를 서버에 저장하지 않는다. -> 세션 방식과 차이점)
4. 클라이언트는 전달 받은 토큰을 저장한다.
JWT 검증 방식 과정
5. 클라이언트는 서버에 요청할 때마다 토큰을 요청 헤더 Authorization 에 포함 시켜 요청한다.
6. 서버는 토큰의 Signature를 비밀키로 복호화 하고, 위변조 여부와 유효기간 등을 확인한다.
7. 유효한 토큰이라면 요청에 응답
Signature은 Header와 Payload와 serect key이 3가지가 HS256 암호화 알고리즘을 통해 생성되는 것이라고 밝혔는데요!
- header
- payload
- secret_key
이 3과정을 거쳐 JWT 토큰을 검증할 수 있습니다!
- 클라이언트에서 넘겨준 요청헤더에 Encoded된 JWT를 header, payload, signature 세가지로 Decode해 분류한다.
- header와 payload를 base64URIEncode한다
- secret_key를 가지고 HMAC256 암호화를 하면? signature가 생성된다.
- 방금 서버에서 생성한 Signature와 클라이언트가 요청한 signature를 비교해본다.
JWT의 장점
- JWT는 토큰에 대한 기본 정보와 전달할 정보 등 필요한 모든 정보를 자체적으로 가지고 있다.
- 중앙의 인증 서버, 데이터 스토어에 대한 의존성이 없다.
- 시스템 수평 확장에 용이하다 (Stateless)
2. Base64 URI Safe Encoding을 사용한다.
- URI, Header, Cookie 모두 사용이 가능하다.
3. 토큰 기반으로 동작하여, 다른 로그인 시스템에 접근 및 권한 공유가 가능하다.
JWT의 단점
- Payload의 정보가 많아지면 트래픽이 증가한다.
- 토큰이 클라이언트에 저장되기 때문에, 서버에서 클라이언트의 토큰을 조작할 수 없다.
- 토큰 내부에 정보가 저장되기 때문에 노출되면 안되는 정보를 저장하는 실수가 생길 수 있다.
- 중간가 공격에 취약하다.
- 토큰이 한번 발급되면 유효기간이 만료될 때 까지 계속 사용이 가능하다
- 서버에 저장하고 있지 않기 때문에 강제로 만료시키기가 어렵다
'JWT' 카테고리의 다른 글
JWT Basic, Bearer 인증 방식 (0) | 2024.07.01 |
---|---|
JWT를 사용하기 위한 security config 세팅 (0) | 2024.06.30 |
JWT를 이해하기전 RSA에 대해 알아보자! (0) | 2024.06.26 |
JWT를 이해하기전 CIA에 대해서 알아보자! (0) | 2024.06.24 |
JWT를 이해하기 전 TCP에 대해 알아보자! (0) | 2024.06.22 |