반응형
jwt의 등장
JWT(토큰)은 JSON Web Token의 약어로, 정보 교환을 위한 인코딩된 텍스트 문자열이다. 주로 인증 및 클레임(claim) 데이터를 포함하여 서버 간에 안전하게 전달된다. JWT는 세 부분으로 구성되어 있다: 헤더(Header), 페이로드(Payload), 서명(Signature).
- 헤더(Header): 토큰의 유형 및 해싱 알고리즘 정보를 담고 있다.
- 페이로드(Payload): 클레임(claim)으로 불리는 정보들을 포함하며, 등록된(registered), 공개(public), 비공개(private) 클레임으로 나뉜다.
- 서명(Signature): 헤더, 페이로드, 비밀 키를 조합하여 생성되며, 토큰의 변조 여부를 확인합니다.
- 클레임(claim): 토큰에 포함되는 정보로, 서버와 클라이언트가 필요한 정보를 교환할 수 있도록 한다.
- 등록된(registered) 클레임: 토큰에 이미 정의된 클레임으로, 토큰의 구조를 정의한다.
- 공개(public) 클레임: 충돌 가능성이 있는 클레임으로, 토큰 생성자와 수신자 간 협의하여 사용한다.
- 비공개(private) 클레임: 서버와 클라이언트 간에 협의된 정보로, 토큰의 내용을 안전하게 전달한다.
헤더
{
"alg": "HS256",
"typ": "JWT"
}
페이로드
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
이 예시에서:
- "sub": 주제(Subject)를 나타냅니다. 토큰에 대한 주요 식별자로 사용된다.
- "name": 사용자 이름을 나타낸다.
- "iat": 발급 시간(Issued At)을 나타냅니다. UNIX 타임스탬프 형식으로 표시된다.
이렇게 헤더와 페이로드를 JSON 형식으로 준비한 다음, 비밀 키와 함께 서명을 생성하여 토큰을 완성한다.
서명(Signature)은 헤더와 페이로드, 그리고 비밀 키를 이용하여 생성됩니다.
서명
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secretKey
)
이러한 세 부분을 합치면 최종적으로 JWT 토큰이 됩니다.
전체 JWT 토큰 예시
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
이 예시에서는 헤더와 페이로드는 Base64로 인코딩되고, 서명은 해당 알고리즘으로 생성되어 합쳐진 형태이며 이렇게 구성된 JWT 토큰은 정보 교환에 사용될 수 있다.
해당 jwt 토큰은 aaaa.bbbb.cccc 형태로 헤더, 페이로드, 서명으로 나뉘게 된다.
아래 예시에서는 PyJWT 라이브러리를 사용하여 JWT 토큰을 생성하고 검증하는 방법을 보여준다.
페이로드에 사용자 정보를 넣고, 비밀 키를 이용하여 서명한다.
import jwt
# 토큰 생성
payload = {"user_id": 123, "role": "admin"}
secret_key = "my_secret_key"
token = jwt.encode(payload, secret_key, algorithm="HS256")
print("Generated Token:", token)
# 토큰 검증
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
print("Decoded Payload:", decoded_payload)
except jwt.ExpiredSignatureError:
print("Token has expired.")
except jwt.InvalidTokenError:
print("Invalid token.")
관리 방법
- 비밀 키 관리: 토큰 생성 및 검증에 사용되는 비밀 키를 안전하게 보관하고 관리한다.
- 토큰 유효 기간 관리: 토큰의 유효 기간을 적절하게 설정하여 타이밍 공격을 방지한다.
- JWT 라이브러리 업데이트: 보안 취약점이 발견될 경우, 사용 중인 JWT 라이브러리를 최신 버전으로 업데이트한다.

반응형
'Web' 카테고리의 다른 글
[웹] 브라우저? 알아볼게요 (0) | 2023.08.18 |
---|---|
[웹] 세션, 쿠키? 알아볼게요( with . python, javascript) (1) | 2023.08.18 |
[웹] 다양한 jwt 토큰 우회 방법 ( with. python ) (0) | 2023.08.16 |
[웹] HTTP 상태코드 한방에 정리 (2) | 2023.08.13 |
[웹]취약한 HTTPS 관련 취약점 점검 방법 (4) | 2023.06.09 |