인증 토큰 디코딩 가이드: OAuth, SAML 및 Bearer 토큰
현대 웹 개발에서 인증은 사용자 이름과 비밀번호만큼 간단한 경우가 드뭅니다. 대신 시스템은 ID 및 권한 데이터를 전달하는 불투명하거나 반투명한 문자열인 "토큰(Tokens)"을 교환합니다. 인증 흐름을 디버깅하거나 보안 감사를 수행할 때 이러한 토큰을 디코딩하고 검사할 수 있는 능력은 중요한 기술입니다.
이 가이드에서는 가장 일반적인 인증 토큰의 기술적 구조와 디코딩 방법을 살펴봅니다.
1. Bearer 토큰 (JWT 및 그 이상)
Bearer 토큰은 API 요청을 인증하는 가장 일반적인 방법입니다. 일반적으로 Authorization 헤더로 전송됩니다.
Authorization: Bearer <token>
Bearer 토큰이란 무엇인가요?
Bearer 토큰은 이를 "소지(bears)"한 사람 누구에게나 액세스 권한을 부여하는 보안 토큰입니다. 물리적인 열쇠와 같습니다. 시스템은 당신이 누구인지 상관하지 않고 열쇠를 가지고 있는지만 확인합니다.
Bearer 토큰 디코딩
대부분의 현대 Bearer 토큰은 **JWT (JSON Web Tokens)**입니다. JWT는 Base64Url로 인코딩된 세 부분으로 구성됩니다.
- 헤더 (Header): 토큰에 대한 메타데이터(알고리즘, 유형).
- 페이로드 (Payload): "클레임"(사용자 ID, 만료 시간, 스코프).
- 서명 (Signature): 토큰이 변조되지 않았음을 증명하는 암호화 증거.
JWT를 수동으로 디코딩하려면 마침표로 문자열을 나누고 처음 두 부분에 Base64Url 디코더를 사용하면 됩니다. 시각적으로 확인하려면 JWT 디코더를 사용할 수 있습니다.
2. OAuth 토큰 디코딩
OAuth 2.0은 여러 유형의 토큰을 사용하지만 가장 자주 접하게 되는 것은 **액세스 토큰(Access Token)**입니다.
불투명 토큰 vs 구조화된 토큰
- 구조화된 토큰 (JWT): 위에서 설명한 대로, 사용자 데이터를 확인하기 위해 로컬에서 디코딩할 수 있습니다.
- 불투명 토큰 (Opaque Tokens): 클라이언트에게는 의미가 없는 임의의 문자열(예: GitHub의
ghp_...)입니다. 이들은 발행한 인증 서버에 의해서만, 일반적으로 **인트로스펙션 엔드포인트(Introspection Endpoint)**를 통해 "디코딩"될 수 있습니다.
OAuth 토큰 검사 방법
토큰이 JWT인 경우 표준 JWT 디코딩 프로세스를 따릅니다. 불투명한 경우 특정 제공업체(Google, Microsoft, GitHub)의 문서를 참조하여 디버깅 도구 또는 토큰의 메타데이터(스코프, 만료 등)를 검사할 수 있는 API를 제공하는지 확인해야 합니다.
3. SAML 어설션 디코더
**SAML (Security Assertion Markup Language)**은 JWT의 XML 기반 형제와 같습니다. 기업용 싱글 사인온(SSO)에서 많이 사용됩니다.
SAML 흐름
SAML을 통해 로그인하면 ID 제공업체(IdP)가 애플리케이션에 SAMLResponse를 보내며, 이는 대개 숨겨진 폼 필드로 전송됩니다.
SAML 어설션 디코딩 방법
SAML 어설션은 일반적으로 Base64로 인코딩된 XML 문서입니다.
- Base64 디코딩: 문자열을 원시 XML로 다시 변환합니다.
- 보기 좋게 출력 (Pretty Print): XML을 읽기 쉽게 포맷합니다.
- 클레임 검사:
<saml:AttributeStatement>를 찾아 사용자의 이메일, 역할 및 기타 속성을 확인합니다.
SAML 어설션은 XML이므로 JWT보다 훨씬 장황하며 디지털 서명(<ds:Signature>)과 때때로 암호화가 포함되는 경우가 많습니다.
4. 기본 인증 (Basic Authentication) 디코딩
오래된 방식이지만 기본 인증은 여전히 간단한 API나 내부 도구에서 흔히 사용됩니다.
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
기본 인증 디코딩
Basic 뒤의 문자열은 username:password 형식의 단순한 Base64 인코딩된 문자열입니다.
디코딩하려면:
- 문자열
dXNlcm5hbWU6cGFzc3dvcmQ=을 가져옵니다. - Base64 디코딩하여
username:password를 얻습니다.
요약표: 토큰 디코딩 한눈에 보기
| 토큰 유형 | 헤더 접두사 | 형식 | 디코딩 방법 |
|---|---|---|---|
| JWT | Bearer |
JSON / Base64Url | Base64Url 디코딩 + JSON 파싱 |
| OAuth (불투명) | Bearer |
임의 문자열 | 토큰 인트로스펙션 API |
| SAML | N/A (폼) | XML / Base64 | Base64 디코딩 + XML 파싱 |
| 기본 인증 | Basic |
문자열 / Base64 | Base64 디코딩 |
결론
인증 토큰을 디코딩하는 방법을 이해하는 것은 "Unauthorized" 오류를 해결하고 애플리케이션이 올바른 권한을 전달하고 있는지 확인하는 데 필수적입니다. 최신 JWT를 다루든 레거시 SAML 어설션을 다루든 첫 번째 단계는 항상 인코딩(일반적으로 Base64)과 기본 형식(JSON 또는 XML)을 식별하는 것입니다.
토큰을 빠르게 검사해야 하나요? JWT 디코더를 사용하여 브라우저에서 안전하게 토큰을 로컬로 파싱해 보세요.