JSON 형식의 데이터를 사용하여 정보를 안전하게 전달하기 위한 토큰 기반 인증 방식
암호화를 통해 데이터의 무결성과 신뢰성을 보장하며, 주로 인증과 권한 부여에 사용된다
구성
세부분으로 구성되며, 각 부분은 . 으로 구분된다
Header.Payload.Signature
1. Header
- 토큰의 타입(JWT)과 암호화 알고리즘 정보를 포함
{
"alg": "HS256", // HMAC SHA-256 알고리즘
"typ": "JWT" // 토큰 타입
}
2. Payload
- 실제 전달하고자 하는 데이터(클레임)를 포함
- 클레임(Claims)은 키-값 쌍으로 이루어진 데이터로, 사용자 정보나 토큰 관련 정보를 저장
- 클레임 종류
- Registered Claims : 토큰에 미리 정의된 표준 정보 (예 : iss, exp, sub 등)
- Public Claims : 공개적으로 정의된 사용자 정보
- Private Claims : 서버와 클라이언트 간에만 공유되는 비공개 정보
{
"sub": "1234567890", // 사용자 ID
"name": "John Doe", // 사용자 이름
"admin": true, // 권한 정보
"iat": 1516239022 // 발행 시간 (Unix 타임스탬프)
}
3. Signature
- 헤더와 페이로드를 조합한 후 비밀 키를 사용해 생성된 암호화 서명
- 서명은 토큰이 위조되지 않았음을 보장한다
- 생성 방법 :
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secretKey
)
동작 방식
1. 사용자 인증
- 사용자가 사용자 이름과 비밀번호를 입력하면 서버에서 이를 검증한다
2. JWT 발급
- 검증에 성공하면 서버는 JWT를 생성하여 클라이언트에 전달한다
3. JWT 포함 요청
- 클라이언트는 이후 요청에서 JWT를 Authorization 헤더에 포함하여 서버로 전송한다
Authorization: Bearer <JWT>
4. JWT 검증
- 서버는 JWT의 서명을 확인하여 무결성을 검증하고, 페이로드의 정보를 기반으로 요청을 처리한다
장점
1. Stateless (상태 비저장)
- 서버가 세션 정보를 유지할 필요가 없다. 모든 인증 정보는 토큰 자체에 포함된다
2. 확장성
- 서버 간 정보를 공유할 필요 없이 JWT만으로 인증을 처리할 수 있어 분산 시스템에 적합하다
3. 빠른 인증
- 요청마다 데이터베이스 조회 없이 토큰의 유효성만 확인하면 된다
4. 다양한 플랫폼 지원
- 웹, 모바일, 데스크톱 애플리케이션 모두에서 사용 가능하다
단점
1. 크기 문제
- JWT는 JSON 데이터를 포함하므로, 일반적인 세션 ID보다 크기가 크다. 네트워크 트래픽에 영향을 줄 수 있다
2. 토큰 무효화 어려움
- 발급된 JWT는 만료시간 전까지 유효하므로, 토큰을 즉시 무효화하는데 어려움
- 이를 해결하기 위해 블랙리스트나 짧은 만료시간 + 리프레시 토큰 전략을 사용한다
3. 보안
- 비밀 키가 유출되면 토큰 위조 위험이 있다
- HTTPS를 반드시 사용해야 한다
사용 사례
1. 사용자 인증
- 로그인 후 JWT를 발급받아 클라이언트가 이후 요청마다 인증 정보를 전달
2. 권한 부여
- 페이로드에 사용자 권한 정보를 포함하여 API 접근 제어
3. 마이크로서비스 통신
- 마이크로서비스 간 인증 및 데이터 전송
4. OAuth 2.0
- 액세스 토큰으로 JWT를 활용
보안 모범 사례
1. 비밀 키 보호
- 서명에 사용되는 비밀 키를 안전하게 관리해야 한다
2. HTTPS 사용
- 네트워크에서 토큰이 탈취되지 않도록 요청과 응답을 암호화
3. 만료 시간 설정
- 짧은 만료 시간을 설정하여 토큰이 유출되더라도 악용 기간을 줄임
4. 리프레시 토큰 사용
- 액세스 토큰이 만료되면 리프레시 토큰을 통해 새 액세스 토큰을 발급
5. 토큰 서명 알고리즘
- 강력한 암호화 알고리즘 (예 : HS256, RS256)을 사용
예제
JWT 구조
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. Header :
{
"alg": "HS256",
"typ": "JWT"
}
2. Payload :
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
3. Signature :
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secretKey
)
요약
- JWT (JSON Web Token)는 클라이언트-서버 간 인증 및 데이터 전달을 위한 토큰
- 구성 : Header, Payload, Signature
- 장점 : 상태 비저장, 확장성, 빠른 인증
- 단점 : 크기 문제, 즉시 무효화 어려움
- 보안을 위해 HTTPS 사용, 짧은 만료 시간 설정, 리프레시 토큰 사용 등이 필요
출처 : ChatGPT
'CS' 카테고리의 다른 글
CSRF (0) | 2025.01.19 |
---|---|
HTTP, HTTPS (0) | 2025.01.15 |
API Key (0) | 2025.01.13 |
Bearer Token (0) | 2025.01.12 |
URI , URL (0) | 2025.01.11 |