JWT의 구조
- 마침표(.)로 구분되어 세 부분으로 나뉨
- Header
- Payload
- Signature
Header
- alg : signing 알고리즘
- typ : token의 타입 (JWT)
- 아래와 같이 구성
- 위 구조가 그대로 base64로 인코딩
Payload
- claim들로 구성
- claim은 entity(일반적으로 user)의 상태와 추가적인 데이터
- 3가지 타입의 claim 존재(registered, public, private)
- registered claims
- 필수는 아니지만 유용하고 상호 호환되는 claim set을 제공하기 위해 추천되는 사전 정의된 claim set이 있음
- iss(issuer)
- exp(expiration time)
- sub(subject)
- aud(audience)
- 등등(https://tools.ietf.org/html/rfc7519#section-4.1)
- 필수는 아니지만 유용하고 상호 호환되는 claim set을 제공하기 위해 추천되는 사전 정의된 claim set이 있음
- public claims
- JWT를 사용하는 사람들이 자유롭게 정의 가능
- 충돌을 피하기 위해 https://www.iana.org/assignments/jwt/jwt.xhtml 에서 정의되거나 충돌 방지를 위한 namespace가 포함된 URI로 정의되어야 함
- private claims
- 두 당사자 간의 동의 하에 registered, public이 아닌 정보를 공유하기 위한 custom claim
- registered claims
- 아래와 같이 구성
- 위 구조가 base64로 인코딩 됨
Signature
- 서명 부분을 만들려면 인코딩 된 header, 인코딩 된 payload, secret을 header에 저장된 algorithm으로 서명해야 함
- 예로 만약 HMAC SHA 256 알고리즘을 사용하면 방식은 아래와 같다.
- 서명은 메시지가 변경되지 않았음을 확인하는 데 사용되며 개인키로 서명된 토큰의 경우 JWT 발신자가 자신이 말하는 사람인지 확인 가능
장점
- 이 방법은 user의 상태를 server 메모리에 저장하지 않음으로써 stateless 한 인증 메커니즘
- 기존 토큰(OAuth : https://victorydntmd.tistory.com/4) 방식은 토큰이 의미 없는 문자열이기 때문에 이 토큰과 연관된 정보(사용자)를 탐색하여 사용자에 연관된 권한을 식별하여 권한 부여
- 하지만 JWT는 필수 정보(유저 정보 등)를 스스로 가지고 있어 DB에서 유저 정보를 조회하거나 로그인되어있는지 상태나 권한 조회 등 없이 바로 사용 가능
- 이는 DB 조회 횟수를 줄여 실제 운영에선 큰 성능 차이가 남
질문
1. JWT를 왜 사용 하나?
- 기본적으로 사용자가 자신을 인증하고, JSON 형식으로 정보를 저장하기 때문에 페이로드(Payload) 내의 데이터 구조화와 파싱이 간단하여 서버 간에 정보를 쉽게 교환가능 하다.
또한 HTTP는 기본적으로 stateless를 지향하기 때문이다.
2. JWT무결성은 어떻게 보장하나?
- JWS를 통해 보장이 된다. JWS는 JWT에서 서명이 된 부분을 말하며, 대표적으로 HMAC SHA256 또는 RSA 알고리즘을 많이 사용한다. 예를 들면 비밀키를 통해 암호화해 JWS를 생성하고 이를 통해 데이터가 변조 되었는지, 누가 보낸건지 검증할 수 있다.
3. JWT 암호화 되는 원리는 무엇인가?
- 기본적으로 JWT는 BASE64를 통해 인코딩 되기 때문에 디코딩이 쉽게 가능 하다. 따라서 중요한 부분을 암호화 하여야 하는데, JWE를 사용하여 JWT의 일부 데이터를 암호화 할 수 있다. JWE는 대칭키 또는 비대칭키 암호화를 사용하여 데이터를 보호하며, 전체 토큰을 암호화하는 대신 페이로드 부분만 암호화하는 것이 일반적이다. JWE를 사용하면 데이터의 기밀성을 보장하면서 JWT의 다른 장점도 계속 활용할 수 있다.
참고-https://syntaxsugar.tistory.com/entry/JOSEJSON-Object-Signing-and-Encryption
JOSE(JSON Object Signing and Encryption)
5G 보안 관련 NF 개발 중에 JOSE(JSON Object Signing and Encryption) 규격을 분석했었는데 이번 포스팅에 정리해봅니다. 개요 JOSE는 당사자간에 claim을 안전하게 전송하기 위한 프레임워크 claim : key/value 쌍
syntaxsugar.tistory.com
'CS' 카테고리의 다른 글
캐시 (0) | 2023.08.16 |
---|---|
쿠키 세션 토큰 (0) | 2023.08.10 |
URI URL URN (0) | 2023.08.03 |
PATCH와 PUT (0) | 2023.08.03 |
대칭키와 비대칭키 (0) | 2023.08.03 |