Base64URL을 디코딩하는 방법
- 입력 · Base64에 문자열을 붙여넣으세요. 페이지를 열면 URL-safe 예시가 들어 있습니다.
- 출력 · 텍스트에서 결과를 읽으세요. 상태 표시줄에 변형(Base64URL 또는 Standard), 디코딩된 바이트 수, 감지된 유형이 나타납니다. 패딩이 빠져 있었다면 “누락된 패딩을 자동으로 추가했습니다.“라고 표시됩니다.
- 토큰에 흔히 들어 있는 JSON은 JSON 보기 좋게 정렬로 들여쓰기됩니다.
- 해시나 랜덤 ID 같은 바이너리 내용이면 도구가 바이너리 데이터라고 알려 주고 알맞은 디코더로 가는 링크를 보여 줍니다.
- 출력 복사나 다운로드로 결과를 가져가세요.
인코딩하려면 Base64URL 인코더를 사용하세요. Base64URL 문자열을 디코딩하지 않고 표준 Base64로 바꾸려면 Base64URL을 Base64로를 사용하세요.
예시
| Base64URL | 디코딩 결과 | 참고 |
|---|---|---|
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | {"alg":"HS256","typ":"JWT"} | 전형적인 JWT 헤더 |
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSIsImFkbWluIjp0cnVlfQ | {"sub":"1234567890","name":"Ada","admin":true} | JWT 페이로드, 패딩 복원됨 |
c3ViamVjdHM_X2Q | subjects?_d | _는 URL-safe 버전의 / |
8J-Riw | 👋 | -는 URL-safe 버전의 + |
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM | 바이너리 32바이트 | SHA-256 해시, RFC 7636의 PKCE 예시 |
마지막 행의 해시는 텍스트로 출력해도 의미가 없습니다. Base64를 Hex로에서 열면 13 d3 1e 96 ... 같은 바이트를 볼 수 있습니다.
패딩과 패딩을 복원할 수 있는 이유
Base64URL은 보통 = 없이 씁니다. 그래도 정보는 사라지지 않습니다. 올바른 문자열의 길이는 4n, 4n + 2, 4n + 3자 중 하나이고, 나머지를 보면 마지막 그룹에 바이트가 하나인지 둘인지 디코더가 알 수 있기 때문입니다. 도구는 디코딩 전에 빠진 =를 붙이고 상태 표시줄에 그 사실을 알립니다.
길이가 4n + 1인 경우는 있을 수 없습니다. “길이가 잘못되었습니다. 문자가 하나 많거나 적습니다.” 오류가 나오면 값을 복사할 때, 예를 들어 이메일이나 로그의 줄 바꿈에서 문자가 하나 빠지거나 더해진 것입니다. 계산 방법은 패딩 설명에 나와 있습니다.
많은 표준 디코더는 이보다 덜 관대합니다. 브라우저의 atob()는 -와 _를 InvalidCharacterError로 거부하고, Python의 base64.urlsafe_b64decode는 =가 없으면 Incorrect padding을 발생시킵니다.
토큰, 쿠키, URL 파라미터
- JWT. 토큰은
xxxxx.yyyyy.zzzzz모양입니다. 앞의 두 부분은 Base64URL JSON이고, 세 번째는 바이너리인 서명입니다. 여기서 부분을 하나씩 디코딩하거나, 토큰 전체를 JWT 디코더에 붙여넣으세요. JWT 디코더는 만료 시각도 보여 주고 서명도 검증합니다. 형식은 JWT 속 Base64에서 설명합니다. - 쿠키와 세션 ID. Flask 같은 일부 프레임워크의 세션 쿠키는 Base64URL 데이터와 서명을 점으로 이어 붙입니다. 데이터 부분만 디코딩하세요.
- URL 파라미터. OAuth
state, 리디렉션 대상, 공유 링크에 Base64URL JSON이 담기기도 합니다. 값에%2F나%2B가 있다면 그 위에 퍼센트 인코딩이 한 번 더 된 것이므로 먼저 URL 디코딩이 필요합니다.
문자열에 -나 _가 +나 /와 섞여 있으면 디코더는 “입력에 표준(+ /) 문자와 URL-safe(- _) 문자가 섞여 있습니다"라며 멈춥니다. 대개 두 값이 합쳐졌거나 하나가 일부만 변환된 경우입니다.
코드에서 Base64URL 디코딩
// Node.js
Buffer.from("c3ViamVjdHM_X2Q", "base64url").toString("utf8"); // "subjects?_d"
// Browsers with Uint8Array.fromBase64
new TextDecoder().decode(Uint8Array.fromBase64("c3ViamVjdHM_X2Q", { alphabet: "base64url" }));
import base64
def b64url_decode(s: str) -> bytes:
return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
b64url_decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") # b'{"alg":"HS256","typ":"JWT"}'
이 패딩 처리 줄은 Base64로 유효한 모든 입력 길이에 맞게 작동합니다. 자세한 내용은 Node.js에서 Base64, JavaScript, Python에 있습니다.
자주 묻는 질문
Base64URL은 어떻게 디코딩하나요?
위에 붙여넣기만 하면 되고 따로 설정할 것은 없습니다. 코드에서는 -를 +로, _를 /로 바꾸고 길이가 4의 배수가 될 때까지 =를 붙인 뒤 일반 Base64로 디코딩하거나, Node의 Buffer.from(s, "base64url") 같은 URL-safe 디코더를 쓰세요.
"." 문자 때문에 오류가 나는 이유는 무엇인가요?
JWT 전체를 붙여넣었기 때문입니다. JWT의 세 부분은 점으로 구분되며 각 부분을 따로 디코딩해야 합니다. 한 부분만 붙여넣거나, 토큰 전체는 JWT 디코더를 사용하세요.
Base64URL 문자열인데 상태 표시줄에 Standard라고 나오는 이유는 무엇인가요?
문자열에 -, _, +, /가 하나도 없어서 두 알파벳 모두에서 유효하고 어느 쪽으로 디코딩해도 결과가 같기 때문입니다. JWT 헤더 중 상당수가 그렇습니다.
값이 아직 퍼센트 인코딩되어 있으면 어떻게 하나요?
인코딩된 =(%3D)는 처리됩니다. %2F 같은 다른 이스케이프가 있다면 값이 URL 인코딩을 거쳤다는 뜻이므로 먼저 URL 디코더로 처리하세요.