주제
JWT 개념
내용
1. JWT 개념
JWT(JSON Web Token)는 웹 애플리케이션에서 클라이언트와 서버 간에 정보를 안전하게 전송하기 위해 사용되는 토큰 기반의 인증 메커니즘입니다. 일반적으로 인증, 세션 처리, 액세스 제어 메커니즘의 일부로 사용되며, 로그인 사용자에 대한 정보를 담은 클레임(claim)을 전송하는 데 활용됩니다.
2. JWT 배경
과거 모놀리식 아키텍처에서는 사용자 인증과 세션 관리를 위해 쿠키와 세션을 주로 사용했습니다. 이 방식에서 서버는 사용자가 로그인하면 세션을 생성하고, 세션 ID를 클라이언트의 쿠키에 저장하여 요청마다 이 세션 ID를 통해 사용자를 식별했습니다. 서버가 세션 데이터를 관리하므로 상태를 유지하는 방식(stateful)으로 작동합니다.
문제점
- 확장성 부족: 서버가 증가하면 각 서버 간 세션 데이터 공유가 필요(EX: Redis 등 외부 세션 저장소 필요).
- 의존성: 세션 저장소에 대한 의존도가 높아, 저장소 장애 시 시스템 전체가 영향을 받을 가능성이 있음
그래서 현대의 분산 시스템이나 마이크로서비스 아키텍처에서는 사용자의 인증 상태를 서버에 저장하지 않고(stateless), 토큰 자체에 필요한 정보를 포함하는 JWT를 사용합니다. 이를 통해 각 서비스는 중앙 저장소 없이도 토큰의 유효성을 확인할 수 있습니다.
3. JWT 구조
JWT 토큰은 Base64 인코딩된 3개 섹션으로 구성되어 있습니다.
<Header>.<Payload>.<Signature>
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwidXNlcm5hbWUiOiJnbmduZ24iLCJleHAiOjE3MzcyMzkwMjJ9.L4ghIGuHBv4C1A5U90grINwA6DIhCx_To_yIIJBMAYA
1) 헤더: 토큰의 유형(JWT)과 사용된 서명 알고리즘(EX: HMAC, RSA)을 지정합니다.
2) 페이로드: 클레임(claim)이라고 불리는 사용자 정보와 데이터(EX:사용자 ID, 권한)를 포함합니다.
3) 서명: 헤더와 페이로드를 조합한 후 비밀 키 또는 개인 키를 사용해 생성된 해시 값으로, 토큰의 무결성과 신뢰성을 검증합니다.- 만약 페이로드나 헤더가 변조된 경우, 서명이 유효하지 않으므로 토큰이 거부됩니다.
- 주로 HS256과 RS256가 사용됩니다.
4. JWT 발행 및 서명
4.1. 대칭키(HS256)
1. JWT 발행 (서명 과정)
a. JWT의 헤더와 페이로드를 연결하여 문자열 생성
{header}.{payload}
b. 연결된 문자열을 HMAC 알고리즘과 비밀 키를 사용하여 해싱
signature = HMAC_SHA256({header}.{payload}, secret_key)
c. b 단계에서 생성한 해시 값이 서명이 됨
{header}.{payload}.{signature}
2. JWT 검증 (서명 유효성 확인)
a. 수신한 JWT의 헤더와 페이로드를 연결하여 새로 해시 값을 생성
new_signature = HMAC_SHA256({header}.{payload}, secret_key)
b. 새로 생성한 new_signature와 JWT에 포함된 signature 비교
- 두 값이 동일하다면, 서명 유효 판단
4.2. 비대칭키(RS256)
1. JWT 발행 (서명 과정)
a. JWT의 헤더와 페이로드를 연결하여 문자열 생성
{header}.{payload}
b. 연결된 문자열을 SHA-256으로 해싱, 비밀 키를 사용하여 암호화
hash = SHA256({header}.{payload})
signature = Encrypt_RSA(hash, private_key)
c. b 단계에서 생성한 해시 값이 서명이 됨
{header}.{payload}.{signature}
2. JWT 검증 (서명 유효성 확인)
a. 수신한 JWT의 헤더와 페이로드를 연결하여 새로 해시 값을 생성
new_hash = SHA256({header}.{payload})
b. 수신한 JWT의 서명을 공개 키로 복호화
original_hash = Decrypt_RSA(signature, public_key)
- 복호화된 original_hash와 새로 계산한 new_hash 비교, 두 값이 동일하면 서명 유효 판단
레퍼런스
- 은별 월드: JWT가 대체 뭘까? 간단히 알아보는 JWT의 개념과 작동 원리 (링크)
- opennaru: JWT (JSON Web Token) – 마이크로서비스를 위한 인증과 인가(링크)
'보안 > 웹·모바일' 카테고리의 다른 글
JWT(JSON Web Token) 취약점 악용 (1) - None Algorithm, Algorithm Confusion (0) | 2025.01.18 |
---|---|
CVE-2024-4577:PHP-CGI 원격 코드 실행 (0) | 2024.12.23 |
Burp Suite로 패킷이 잘 안잡힘 해결 (0) | 2024.02.16 |
[IOS] Fairplay DRM 복호화 툴 frida-ios-dump (Windows) (0) | 2023.11.09 |
[IOS] "Alpine" 패스워드가 작동하지 않는 경우 (0) | 2023.11.06 |