2023.07.02 - [Django] - 사용자 로그인 - JWT 적용하기 - 1. Session 이해하기
JWT (Json Web Token) 이란?
JWT는 JSON Web Token의 약자로, 웹 표준으로 지정된 토큰 기반의 인증 방식이다. JWT는 사용자의 정보를 JSON 객체로 안전하게 전송하기 위한 방법으로, 특히 분산 시스템에서 인증 정보를 공유할 때 유용하다.
JWT의 구성
JWT는 세 부분으로 구성되어 있다.
Header
JWT의 헤더(Header)는 JWT의 유형과 암호화 알고리즘 정보를 포함하는 부분입니다. 헤더는 Base64로 인코딩 된 JSON 객체로 구성되어 있다.
헤더는 다음과 같은 두 가지 주요 속성을 포함한다.
- 토큰 유형(Type): 토큰의 유형을 나타내는 속성이다. 일반적으로 JWT 토큰은 "JWT"로 지정된다. 이 속성은 다른 유형의 토큰을 나타내기 위해 확장될 수 있다.
- 암호화 알고리즘(Algorithm): 토큰의 서명 및 검증에 사용되는 암호화 알고리즘을 지정하는 속성이다. JWT는 다양한 암호화 알고리즘을 지원하며, 일반적으로 HMAC SHA256 또는 RSA를 사용한다. 이 속성은 "HS256" 또는 "RS256"와 같은 알고리즘 식별자로 표시된다.
{ "alg": "HS256", "typ": "JWT" }
- 헤더는 토큰의 유효성을 검증하는 데 사용된다. 토큰을 수신한 서버나 클라이언트는 헤더에서 지정된 암호화 알고리즘을 사용하여 토큰의 서명을 검증한다. 이를 통해 토큰이 변조되지 않았음을 확인할 수 있다.
- 헤더의 정보는 Base64로 인코딩되어 페이로드와 함께 토큰의 일부로 전송된다. 토큰을 해독할 때는 Base64 디코딩을 통해 헤더의 원래 JSON 객체를 얻을 수 있다.
- Header는 Base64로 인코딩되어 JWT의 첫 번째 세그먼트로 들어간다.
Payload
JWT의 Payload는 사용자 정보와 추가적인 메타데이터를 포함한다. Payload는 Base64로 인코딩 되어 JWT의 두 번째 세그먼트로 들어간다.
Payload는 세 가지 부분으로 구성되어 있다.
- Registered claims : JWT에서 미리 정의된 정보이다. 예를 들어, `iss`(Issuer), `exp`(Expiration Time), `sub`(Subject) 등이 있다.
- "iss" (Issuer): 토큰을 발급한 발급자를 나타낸다.
- "sub" (Subject): 토큰의 주제(대상)를 나타냅니다. 일반적으로 사용자 ID와 같은 식별자가 될 수 있다.
- "aud" (Audience): 토큰의 대상(수신자)을 나타낸다.
- "exp" (Expiration Time): 토큰의 만료 시간을 나타낸다.
- "nbf" (Not Before): 토큰의 사용 가능한 시작 시간을 나타낸다.
- "iat" (Issued At): 토큰이 발급된 시간을 나타낸다.
- "jti" (JWT ID): JWT의 고유 식별자를 나타낸다.
- Public claims : 사용자가 임의로 지정할 수 있는 정보이다. 공개 클레임은 충돌을 피하기 위해 네임스페이스 접두사를 사용하는 것이 권장된다. 예를 들면, "user_id", "email", "role" 등의 사용자 지정 클레임을 포함할 수 있다.
- Private claims : 사용자가 임의로 지정할 수 있는 정보 중, 충돌이 발생하지 않도록 등록된 정보이다. 이 클레임은 서버와 클라이언트 간의 사전 협의에 따라 사용된다. 특정 애플리케이션 또는 도메인에 특화된 데이터를 포함할 수 있다.
Signature
JWT의 Signature는 Header와 Payload를 서명한다. 서명하는 방법은 Header에서 지정한 알고리즘에 따라 달라진다. 서명된 Signature는 Base64로 인코딩 되어 JWT의 세 번째 세그먼트로 들어간다.
JWT의 장단점
장점
- Stateless : 서버에서 세션을 유지할 필요가 없기 때문에 서버 자원을 아낄 수 있다.
- 분산 시스템에서 유용 : JWT는 분산 시스템에서 인증 정보를 공유하기 위한 안전한 방법을 제공한다.
- 안전성 : JWT는 서명이 되어 있기 때문에 데이터가 변조되었는지 여부를 확인할 수 있다.
단점
- Payload가 노출될 위험이 있음 : JWT는 Base64로 인코딩되어 있기 때문에, Payload가 노출될 위험이 있다. 따라서, 중요한 정보는 반드시 암호화되어야 한다.
- 만료 시간 처리 : 만료 시간이 지난 JWT는 더 이상 유효하지 않다. 따라서, 클라이언트가 새로운 토큰을 요청해야 한다.
'Django' 카테고리의 다른 글
Swagger - SerializerMethodField의 return type hint (0) | 2023.07.04 |
---|---|
사용자 로그인 - JWT 적용하기 - 1. Session 이해하기 (0) | 2023.07.02 |
인증 구현하기 (0) | 2023.05.14 |
Django Channels - 채팅 기능 구현하기 - 1 (0) | 2023.05.08 |
Django Channels - Consumer 살펴보기 (0) | 2023.05.05 |