본문 바로가기
MSA

투명 토큰(Transparent Token), 불투명 토큰(Opaque Token)

by xogns93 2024. 12. 17.

투명 토큰(Transparent Token)과 불투명 토큰(Opaque Token)은 토큰의 정보 구조사용 목적에 따라 구분됩니다.


1. 투명 토큰 (Transparent Token) = JWT

특징

  • 바디에 정보(클레임)를 가지고 있습니다.
  • JWT (JSON Web Token)는 투명 토큰의 대표적인 예입니다.
  • 토큰 자체에 사용자 정보와 인증 관련 데이터가 담겨 있기 때문에 서버 측에서 별도의 검증 저장소를 확인하지 않고도 토큰만으로 정보를 해석할 수 있습니다.

구조

JWT는 다음과 같이 3가지 부분으로 구성됩니다:

  1. Header: 토큰의 타입과 서명 알고리즘 정보를 담습니다.
  2. Payload: 사용자 정보(클레임)가 담겨 있습니다.
  3. Signature: 토큰의 무결성을 검증하기 위한 서명입니다.
Header:
{
  "alg": "HS256",
  "typ": "JWT"
}

Payload:
{
  "sub": "1234567890",
  "name": "John Doe",
  "role": "admin",
  "exp": 1516239022
}

장점

  1. 토큰 자체에 정보가 포함되어 있어 서버가 상태를 저장하지 않아도 됩니다. (Stateless)
  2. 토큰만으로 사용자 정보와 유효성을 검증할 수 있습니다.
  3. 분산 시스템에서 효율적으로 사용됩니다.

단점

  1. 바디에 정보가 노출되므로 Base64 디코딩만으로 정보가 읽힙니다. (서명을 위조할 수는 없지만 정보는 노출될 수 있음)
  2. 클레임(정보)이 많아지면 토큰의 크기가 커질 수 있습니다.
  3. 토큰 만료 후 무효화가 어려운 점이 있습니다.

2. 불투명 토큰 (Opaque Token)

특징

  • 바디에 정보가 포함되지 않습니다.
  • 불투명 토큰은 단순히 무작위 문자열 형태의 토큰입니다.
  • 토큰 자체는 의미를 가지지 않고, 토큰의 유효성 확인과 관련 정보서버 측 데이터베이스 또는 인증 서버에서 확인해야 합니다.
  • 대표적인 예: OAuth 2.0 액세스 토큰(일반적으로 사용되는 형태)

사용 흐름

  1. 서버가 토큰 발급: 클라이언트가 인증되면 무작위 문자열 토큰을 발급합니다.
  2. 토큰 검증: 서버에 요청이 들어오면 토큰을 인증 서버에 보내서 해당 토큰이 유효한지 확인합니다.
  3. 토큰 정보 확인: 서버는 토큰을 통해 관련 정보를 조회합니다.

장점

  1. 보안성이 높습니다: 토큰에는 어떤 정보도 담겨 있지 않아 노출되어도 악용될 가능성이 적습니다.
  2. 서버에서 토큰을 강제로 무효화할 수 있습니다. (상태 저장이 필요하지만 이점이 될 수 있음)
  3. 토큰 크기가 작습니다: 단순한 문자열이기 때문에 데이터 양이 적습니다.

단점

  1. 상태 저장이 필요합니다: 서버 또는 인증 서버에서 토큰의 유효성 및 사용자 정보를 관리해야 합니다.
  2. 추가 요청이 필요합니다: 토큰을 검증하기 위해 별도의 서버에 요청을 보내야 합니다.

3. 투명 토큰과 불투명 토큰 비교

구분 투명 토큰 (JWT) 불투명 토큰 (Opaque Token)
정보 포함 여부 토큰 자체에 정보(클레임)가 포함됨 토큰 자체에 정보가 없음
검증 방식 토큰 자체에서 유효성 검증 가능 인증 서버나 저장소에서 검증 필요
상태 관리 Stateless (서버 상태 저장 불필요) Stateful (서버 측에서 토큰 상태 관리)
보안성 정보가 노출될 수 있음 (Base64 디코딩 가능) 토큰에 정보가 없어 노출되어도 안전함
무효화 즉시 무효화 어렵고 만료 시간까지 유지됨 즉시 무효화 가능 (서버에서 제어)
토큰 크기 클레임이 많아지면 토큰 크기가 커질 수 있음 단순 문자열로 크기가 작음
사용 예시 JWT (JSON Web Token) OAuth 2.0의 Access Token

4. 결론

  1. 투명 토큰 (JWT)

    • 토큰 자체에 정보가 담겨 있어서 Stateless한 시스템에 유리합니다.
    • 사용자 정보를 빠르게 확인할 수 있지만 보안적인 위험이 있으므로 민감한 정보는 담지 말아야 합니다.
  2. 불투명 토큰

    • 토큰 자체에는 정보가 없고 서버에서 상태를 관리하기 때문에 보안성이 높고, 즉시 무효화할 수 있습니다.
    • 그러나 토큰 검증 시 추가 요청이 필요하고, 상태 관리 부담이 생깁니다.

어떤 것을 선택해야 할까?

  • JWT (투명 토큰):

    • 분산 시스템이나 Stateless 환경에서 사용하기 좋습니다.
    • 토큰을 검증하는 속도가 빠릅니다.
  • 불투명 토큰:

    • 보안이 중요한 시스템이나 토큰 무효화가 빈번히 필요한 시스템에서 사용합니다.
    • OAuth 2.0의 Access Token으로 많이 사용됩니다.