투명 토큰(Transparent Token)과 불투명 토큰(Opaque Token)은 토큰의 정보 구조와 사용 목적에 따라 구분됩니다.
1. 투명 토큰 (Transparent Token) = JWT
특징
- 바디에 정보(클레임)를 가지고 있습니다.
- JWT (JSON Web Token)는 투명 토큰의 대표적인 예입니다.
- 토큰 자체에 사용자 정보와 인증 관련 데이터가 담겨 있기 때문에 서버 측에서 별도의 검증 저장소를 확인하지 않고도 토큰만으로 정보를 해석할 수 있습니다.
구조
JWT는 다음과 같이 3가지 부분으로 구성됩니다:
- Header: 토큰의 타입과 서명 알고리즘 정보를 담습니다.
- Payload: 사용자 정보(클레임)가 담겨 있습니다.
- Signature: 토큰의 무결성을 검증하기 위한 서명입니다.
Header:
{
"alg": "HS256",
"typ": "JWT"
}
Payload:
{
"sub": "1234567890",
"name": "John Doe",
"role": "admin",
"exp": 1516239022
}
장점
- 토큰 자체에 정보가 포함되어 있어 서버가 상태를 저장하지 않아도 됩니다. (Stateless)
- 토큰만으로 사용자 정보와 유효성을 검증할 수 있습니다.
- 분산 시스템에서 효율적으로 사용됩니다.
단점
- 바디에 정보가 노출되므로 Base64 디코딩만으로 정보가 읽힙니다. (서명을 위조할 수는 없지만 정보는 노출될 수 있음)
- 클레임(정보)이 많아지면 토큰의 크기가 커질 수 있습니다.
- 토큰 만료 후 무효화가 어려운 점이 있습니다.
2. 불투명 토큰 (Opaque Token)
특징
- 바디에 정보가 포함되지 않습니다.
- 불투명 토큰은 단순히 무작위 문자열 형태의 토큰입니다.
- 토큰 자체는 의미를 가지지 않고, 토큰의 유효성 확인과 관련 정보는 서버 측 데이터베이스 또는 인증 서버에서 확인해야 합니다.
- 대표적인 예: OAuth 2.0 액세스 토큰(일반적으로 사용되는 형태)
사용 흐름
- 서버가 토큰 발급: 클라이언트가 인증되면 무작위 문자열 토큰을 발급합니다.
- 토큰 검증: 서버에 요청이 들어오면 토큰을 인증 서버에 보내서 해당 토큰이 유효한지 확인합니다.
- 토큰 정보 확인: 서버는 토큰을 통해 관련 정보를 조회합니다.
장점
- 보안성이 높습니다: 토큰에는 어떤 정보도 담겨 있지 않아 노출되어도 악용될 가능성이 적습니다.
- 서버에서 토큰을 강제로 무효화할 수 있습니다. (상태 저장이 필요하지만 이점이 될 수 있음)
- 토큰 크기가 작습니다: 단순한 문자열이기 때문에 데이터 양이 적습니다.
단점
- 상태 저장이 필요합니다: 서버 또는 인증 서버에서 토큰의 유효성 및 사용자 정보를 관리해야 합니다.
- 추가 요청이 필요합니다: 토큰을 검증하기 위해 별도의 서버에 요청을 보내야 합니다.
3. 투명 토큰과 불투명 토큰 비교
구분 | 투명 토큰 (JWT) | 불투명 토큰 (Opaque Token) |
---|---|---|
정보 포함 여부 | 토큰 자체에 정보(클레임)가 포함됨 | 토큰 자체에 정보가 없음 |
검증 방식 | 토큰 자체에서 유효성 검증 가능 | 인증 서버나 저장소에서 검증 필요 |
상태 관리 | Stateless (서버 상태 저장 불필요) | Stateful (서버 측에서 토큰 상태 관리) |
보안성 | 정보가 노출될 수 있음 (Base64 디코딩 가능) | 토큰에 정보가 없어 노출되어도 안전함 |
무효화 | 즉시 무효화 어렵고 만료 시간까지 유지됨 | 즉시 무효화 가능 (서버에서 제어) |
토큰 크기 | 클레임이 많아지면 토큰 크기가 커질 수 있음 | 단순 문자열로 크기가 작음 |
사용 예시 | JWT (JSON Web Token) | OAuth 2.0의 Access Token |
4. 결론
투명 토큰 (JWT)
- 토큰 자체에 정보가 담겨 있어서 Stateless한 시스템에 유리합니다.
- 사용자 정보를 빠르게 확인할 수 있지만 보안적인 위험이 있으므로 민감한 정보는 담지 말아야 합니다.
불투명 토큰
- 토큰 자체에는 정보가 없고 서버에서 상태를 관리하기 때문에 보안성이 높고, 즉시 무효화할 수 있습니다.
- 그러나 토큰 검증 시 추가 요청이 필요하고, 상태 관리 부담이 생깁니다.
어떤 것을 선택해야 할까?
JWT (투명 토큰):
- 분산 시스템이나 Stateless 환경에서 사용하기 좋습니다.
- 토큰을 검증하는 속도가 빠릅니다.
불투명 토큰:
- 보안이 중요한 시스템이나 토큰 무효화가 빈번히 필요한 시스템에서 사용합니다.
- OAuth 2.0의 Access Token으로 많이 사용됩니다.
'MSA' 카테고리의 다른 글
Authorization Code Grant (0) | 2024.12.17 |
---|---|
Proof Key for Code Exchange (PKCE, 픽시) (0) | 2024.12.17 |
스프링 웹 MVC의 아규먼트 리졸버(Argument Resolver) (1) | 2024.12.16 |
RestTemplate(동기,블로킹) & Kafka(비동기,논블로킹) (0) | 2024.12.16 |
서비스 게이트웨이 & API 게이트웨이 (3) | 2024.12.16 |