파일 업로드
  1. base64hub
  2. 웹·토큰 도구
  3. Base64URL 인코더

Base64URL 인코더: 온라인 URL-safe Base64

텍스트를 URL-safe Base64로 인코딩합니다. +와 / 대신 -와 _를 쓰고 끝의 =를 뺍니다. 결과는 별도의 이스케이프 없이 URL, 쿠키, 토큰에 넣을 수 있습니다.

무료 가입 없음, 제한 없음 로컬 업로드 없음 RFC 4648 5절 알파벳 업데이트 2026. 10. 27.
입력 0 B출력 0 B크기 –

브라우저에서 처리됩니다. 이 페이지는 데이터를 어디로도 보낼 수 없습니다 – 확인 방법

Base64URL로 인코딩하는 방법

  1. 입력 · 텍스트에 텍스트를 입력하거나 붙여넣으세요.
  2. 출력 · Base64에서 Base64URL을 복사하세요. 이 페이지에서는 URL-safe (- _) 옵션과 패딩 없음 (=) 옵션이 이미 체크되어 있습니다.
  3. 받는 쪽이 패딩을 원하면 패딩 없음 (=) 체크를 해제하세요. 표준 Base64를 원하면 URL-safe도 해제하거나 Base64 인코딩을 사용하세요.
  4. 출력을 복사하거나 base64.txt로 다운로드하세요.

값을 디코딩하려면 Base64URL 디코더를 쓰고, 이미 있는 문자열을 두 알파벳 사이에서 변환하려면 Base64를 Base64URL로를 쓰세요.

표준 Base64와 무엇이 다른가

다른 문자는 세 개뿐입니다. 3바이트를 4문자로 바꾸는 규칙을 비롯한 나머지는 모두 같습니다.

표준 Base64Base64URL
값 62+-
값 63/_
패딩= 필수보통 생략
정의RFC 4648 4절RFC 4648 5절

짧은 문자열은 대개 두 변형이 패딩에서만 다릅니다. 알파벳 차이는 6비트 그룹의 값이 62나 63일 때 나타나는데, ?나 > 같은 문자와 비 ASCII 바이트 상당수가 이런 값을 만듭니다.

입력표준Base64URL, 패딩 없음
Hi!SGkhSGkh
?>?>Pz4/Pg==Pz4_Pg
subjects?_dc3ViamVjdHM/X2Q=c3ViamVjdHM_X2Q
https://example.com/?q=1aHR0cHM6Ly9leGFtcGxlLmNvbS8/cT0xaHR0cHM6Ly9leGFtcGxlLmNvbS8_cT0x

역사와 디코딩 차이는 Base64와 Base64URL 비교에서 더 깊이 다룹니다.

URL에 별도의 알파벳이 필요한 이유

표준 문자 세 개는 URL 안에서 각각 의미를 가집니다. /는 경로 세그먼트를 나누고, =는 쿼리 문자열에서 이름과 값을 나누며, +는 폼 디코더가 공백으로 읽습니다. 쿼리 파라미터에 넣은 a+b/c== 같은 표준 Base64 값은 모든 문자를 이스케이프하지 않으면 a b/c==로 도착합니다. 퍼센트 인코딩으로 해결할 수 있지만 각 문자가 세 글자(%2B, %2F, %3D)가 됩니다.

Base64URL은 URL에서 예약되지 않은 두 문자를 고르고 패딩을 빼므로, 값을 경로, 쿼리 문자열, 프래그먼트, 쿠키, 파일 이름에 그대로 붙여넣을 수 있습니다. -와 _는 /와 달리 흔히 쓰는 모든 파일 시스템에서 파일 이름에 안전합니다.

Base64URL이 쓰이는 곳

  • JWT와 JOSE. JSON Web Token의 모든 부분은 RFC 7515에 정의된 패딩 없는 Base64URL입니다. JWT 디코더로 토큰을 읽을 수 있고, 구조는 JWT 속 Base64에서 설명합니다.
  • OAuth PKCE. code_challenge는 code_verifier의 SHA-256 해시를 Base64URL로 인코딩한 값입니다.
  • WebAuthn과 패스키. 자격 증명 ID와 챌린지가 JSON 안에서 Base64URL로 오갑니다.
  • 링크와 ID. 공유 링크, 서명된 URL 파라미터, 랜덤 바이트로 만든 짧은 ID가 URL을 깔끔하게 유지하려고 Base64URL을 씁니다.

코드에서 Base64URL

Node.js에는 내장 base64url 인코딩이 있고, Python에는 URL-safe 함수가 있지만 패딩은 직접 제거해야 합니다.

// Node.js
Buffer.from("subjects?_d").toString("base64url");   // "c3ViamVjdHM_X2Q"

// Browsers with Uint8Array.prototype.toBase64
new TextEncoder().encode("subjects?_d").toBase64({ alphabet: "base64url", omitPadding: true });
import base64, hashlib

base64.urlsafe_b64encode(b"subjects?_d").rstrip(b"=").decode()   # 'c3ViamVjdHM_X2Q'

# PKCE code_challenge, example from RFC 7636 appendix B
verifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
digest = hashlib.sha256(verifier.encode("ascii")).digest()
base64.urlsafe_b64encode(digest).rstrip(b"=").decode()
# 'E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM'

자세한 내용은 Node.js에서 Base64, JavaScript, Python에 있으며, 브라우저 API는 Uint8Array.toBase64에서 다룹니다.

자주 묻는 질문

Base64URL이란 무엇인가요?

RFC 4648 5절에 정의된, URL과 파일 이름에 안전한 Base64 변형입니다. 알파벳의 마지막 두 문자로 +와 / 대신 -와 _를 쓰며, 보통 = 패딩 없이 표기합니다.

일반 Base64를 퍼센트 인코딩하면 안 되나요?

작동은 하지만 +, /, = 하나마다 세 글자가 들고, 이스케이프를 하나라도 빠뜨리면 쿼리 문자열을 파싱할 때 +가 공백으로 바뀝니다. Base64URL은 두 문제를 모두 피합니다.

= 패딩을 남겨 둬야 하나요?

JWT와 대부분의 URL-safe 형식은 패딩을 생략합니다. =도 URL에서 이스케이프가 필요하고, 디코더가 길이에서 패딩을 계산할 수 있기 때문입니다. 받는 시스템이 요구할 때만 남기세요. 패딩 없음 체크를 해제하면 됩니다.

PKCE code_challenge는 어떻게 만드나요?

code_verifier를 SHA-256으로 해시하고, 해시 32바이트를 패딩 없이 Base64URL로 인코딩합니다. 이 페이지는 해시 바이트가 아니라 텍스트를 인코딩하므로 코드로 처리하세요. 아래 코드가 RFC 7636의 예시를 재현합니다.