JSON Web Token (JWT) 디코더: JWT 콘텐츠 및 클레임 검사

· 12분 읽기

목차

JSON Web Token 이해하기

JSON Web Token(JWT)은 당사자 간에 JSON 객체로 정보를 안전하게 전송하는 데 사용되는 컴팩트하고 자체 포함된 토큰입니다. 현대 웹 애플리케이션, 모바일 앱 및 마이크로서비스 아키텍처에서 인증 및 정보 교환을 위한 사실상의 표준이 되었습니다.

사용자 데이터가 서버에 저장되는 전통적인 세션 기반 인증과 달리, JWT는 토큰 자체에 데이터를 직접 포함합니다. 이러한 근본적인 차이로 인해 JWT는 상태 비저장 작업에 이상적입니다. 서버는 모든 요청마다 사용자 신원을 확인하기 위해 세션 저장소를 유지하거나 데이터베이스를 쿼리할 필요가 없습니다.

JWT를 디지털 여권처럼 생각해보세요. 여권에 신원 정보가 포함되어 있고 홀로그램과 워터마크로 암호화 방식으로 보호되는 것처럼, JWT에는 사용자에 대한 클레임이 포함되어 있고 변조를 방지하기 위해 암호화 방식으로 서명됩니다. 국경 통제소에서 여권을 제시할 때 관리들은 본국에 전화하지 않고도 진위를 확인할 수 있습니다. 마찬가지로 서비스는 발급 서버에 연락하지 않고도 JWT를 확인할 수 있습니다.

전문가 팁: JWT는 중앙 집중식 세션 상태를 유지하는 것이 병목 현상을 일으킬 수 있는 분산 시스템 및 마이크로서비스 아키텍처에서 특히 유용합니다. 각 서비스는 서비스 간 통신 없이 독립적으로 토큰을 확인할 수 있습니다.

JWT가 빛을 발하는 일반적인 시나리오는 다음과 같습니다:

JWT의 3부분 구조

모든 JWT는 마침표(점)로 구분된 세 개의 고유한 부분으로 구성됩니다. 각 부분은 토큰의 기능 및 보안 모델에서 특정 목적을 수행합니다. JWT를 보면 다음과 같습니다:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

각 구성 요소를 분석해 보겠습니다:

헤더

헤더는 일반적으로 두 부분으로 구성됩니다: 토큰 유형(JWT) 및 사용 중인 서명 알고리즘(예: HMAC SHA256 또는 RSA). 이 정보는 수신 측에 토큰을 처리하고 확인하는 방법을 알려줍니다.

디코딩된 헤더는 다음과 같습니다:

{
  "alg": "HS256",
  "typ": "JWT"
}

페이로드

페이로드에는 클레임(일반적으로 사용자에 대한 설명 및 추가 메타데이터)이 포함됩니다. 클레임은 세 가지 유형으로 분류됩니다:

클레임 유형 설명 예시
등록된 클레임 JWT 사양에서 권장하는 사전 정의된 클레임 iss, exp, sub, aud
공개 클레임 JWT를 사용하는 사람들이 정의한 사용자 정의 클레임, 충돌 방지 필요 name, email, role
비공개 클레임 당사자 간에 합의된 사용자 정의 클레임 department, permissions

일반적인 페이로드는 다음과 같습니다:

{
  "sub": "1234567890",
  "name": "John Doe",
  "email": "[email protected]",
  "role": "admin",
  "iat": 1516239022,
  "exp": 1516242622
}

서명

서명은 토큰이 변조되지 않았음을 보장하는 암호화 봉인입니다. 인코딩된 헤더, 인코딩된 페이로드, 비밀 키를 가져와 헤더에 지정된 알고리즘을 적용하여 생성됩니다.

예를 들어 HMAC SHA256을 사용하는 경우 서명은 다음과 같이 생성됩니다:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

서명을 통해 수신자는 JWT의 발신자가 본인이 말하는 사람이 맞는지, 메시지가 도중에 변경되지 않았는지 확인할 수 있습니다.

JSON Web Token 디코더를 사용하는 이유

JWT는 기계가 읽을 수 있도록 설계되었지만, 개발자는 개발, 디버깅 및 보안 감사 중에 내용을 검사해야 하는 경우가 많습니다. JWT 디코더는 Base64로 인코딩된 문자열을 사람이 읽을 수 있는 JSON으로 변환하여 토큰에 포함된 정보를 쉽게 이해할 수 있게 합니다.

개발자가 JWT 디코더를 사용하는 주요 이유는 다음과 같습니다:

개발 및 디버깅

인증 시스템을 구축할 때 토큰에 올바른 클레임이 포함되어 있고 형식이 올바른지 확인해야 합니다. 디코더를 사용하면 사용자 정의 코드를 작성하거나 명령줄 도구를 사용하지 않고도 토큰을 빠르게 검사할 수 있습니다.

예를 들어 사용자가 인증 문제를 보고하는 경우 JWT를 디코딩하여 exp(만료) 클레임이 지났는지 또는 필수 클레임이 누락되었는지 확인할 수 있습니다.

보안 감사

보안 팀은 JWT 디코더를 사용하여 잠재적인 취약점에 대한 토큰을 분석합니다. 다음을 확인할 수 있습니다:

통합 테스트

JWT 인증을 사용하는 타사 API와 통합할 때 토큰을 디코딩하면 예상되는 형식과 클레임 구조를 이해하는 데 도움이 됩니다. 이는 문서가 불완전하거나 오래된 경우 특히 유용합니다.

학습 및 교육

JWT를 처음 접하는 개발자의 경우 디코더는 3부분 구조가 어떻게 작동하는지, 페이로드 변경이 최종 토큰에 어떤 영향을 미치는지에 대한 즉각적인 시각적 피드백을 제공합니다.

빠른 팁: 실제 사용자 데이터가 포함된 프로덕션 JWT를 온라인 디코더에 붙여넣지 마세요. 서버로 데이터를 전송하지 않고 브라우저에서 완전히 토큰을 처리하는 JWT 디코더 도구를 사용하세요.

단계별 디코딩 프로세스

프로세스를 이해하면 JWT 디코딩은 간단합니다. 내부적으로 작동하는 방식은 다음과 같습니다:

1단계: 토큰 분할

먼저 마침표 문자에서 JWT 문자열을 분할하여 세 부분을 분리합니다:

const parts = token.split('.');
const header = parts[0];
const payload = parts[1];
const signature = parts[2];

2단계: Base64 디코딩

각 부분은 Base64URL로 인코딩되어 있습니다(Base64의 URL 안전 변형). 헤더와 페이로드를 디코딩하여 JSON 문자열을 가져옵니다:

const decodedHeader = atob(header);
const decodedPayload = atob(payload);

3단계: JSON 파싱

디코딩된 문자열을 JSON 객체로 파싱합니다:

const headerObj = JSON.parse(decodedHeader);
const payloadObj = JSON.parse(decodedPayload);

4단계: 내용 검사

이제 클레임과 메타데이터를 검사할 수 있습니다. 다음과 같은 표준 클레임을 확인하세요:

JWT 디코더를 사용하면 이 전체 프로세스가 브라우저에서 즉시 발생합니다. 토큰을 붙여넣기만 하면 디코딩된 헤더와 페이로드를 즉시 볼 수 있습니다.

토큰 서명 검증

JWT 디코딩은 이야기의 절반에 불과합니다. 검증은 보안이 발생하는 곳입니다. 누구나 JWT를 디코딩할 수 있습니다(단순히 Base64로 인코딩된 JSON이기 때문에). 그러나 올바른 비밀 또는 공개 키를 가진 당사자만 서명을 확인할 수 있습니다.

서명 검증이 중요한 이유

서명은 두 가지 중요한 보안 속성을 보장합니다:

  1. 무결성: 토큰이 서명된 이후 수정되지 않았음
  2. 진위성: 토큰이 비밀 키를 소유한 신뢰할 수 있는 당사자에 의해 생성되었음

서명 검증이 없으면 공격자가 JWT를 디코딩하고 페이로드를 변경하고(아마도 권한을 "user"에서 "admin"으로 상승시킴), 다시 인코딩하고, 수정된 토큰을 사용할 수 있습니다. 서명은 이러한 공격을 방지합니다.

검증 프로세스

JWT 서명을 검증하려면 다음이 필요합니다:

검증 프로세스는 토큰의 헤더와 페이로드를 사용하여 서명을 재생성한 다음 토큰에 포함된 서명과 비교합니다. 일치하면 토큰이 유효합니다.

전문가 팁: 항상 서버 측에서 JWT를 검증하고 클라이언트 측 검증만 신뢰하지 마세요. 공격자는 클라이언트 측 검사를 우회할 수 있지만 비밀 키 없이는 유효한 서명을 위조할 수 없습니다.

일반적인 서명 알고리즘

알고리즘 유형 키 유형 사용 사례
HS256 SHA-256을 사용한 HMAC 대칭(공유 비밀) 간단한 애플리케이션, 동일한 당사자가 생성 및 검증
RS256 SHA-256을 사용한 RSA 비대칭(공개/개인 키 쌍) 분산 시스템, 여러 검증자
ES256

📚 You May Also Like