UTF-8을 Base64URL로 변환하려면 4단계를 거칩니다: (1) 텍스트를 UTF-8 바이트로 인코딩, (2) 표준 Base64 적용, (3) +를 -로, /를 _로 교체, (4) 끝의 = 패딩 제거. 이렇게 하면 RFC 4648을 준수하는URL 안전 문자열이 생성되며, JWT와 API 헤더에 널리 사용됩니다.
표준 Base64와 Base64URL의 차이
| 항목 | 표준 Base64 | Base64URL | 이유 |
|---|---|---|---|
| 62번째 문자 | + |
- |
+는 URL에서 공백을 의미함 |
| 63번째 문자 | / |
_ |
/는 URL의 경로 구분자 |
| 패딩 | = 필수 |
생략 | =는 URL에서 %3D가 됨 |
| URL 안전 | 아니요 | 네 | 쿼리 문자열과 파일명에 직접 사용 가능 |
RFC 4648 §5에 따라, 이 「URL 및 파일명 안전 알파벳」은 시스템 간 호환성을 보장합니다.

4단계 변환 프로세스
| 단계 | 작업 | 예시 (“Hello”) |
|---|---|---|
| 1 | UTF-8 텍스트 → 바이트 | H e l l o → 바이트 배열 |
| 2 | 바이트 → 표준 Base64 | SGVsbG8= |
| 3 | +를 -로, /를 _로 교체 |
여기서는 변경 불필요 |
| 4 | 끝의 = 패딩 제거 |
SGVsbG8 |
위키백과에 따르면, Base64 인코딩은 데이터 크기를 약 33% 증가시킵니다.

유니코드 및 이모지 처리
NextUtils에 따르면, Base64는인코딩이지 암호화가 아닙니다—텍스트 전용 채널을 통해 데이터를 전송하는 것입니다. 깨진 문자(「Mojibake」)를 방지하려면 반드시 TextEncoder를 사용하여 UTF-8 바이트로 먼저 변환해야 합니다.
| 입력 | TextEncoder 미사용 | TextEncoder 사용 |
|---|---|---|
Hello 세계! 🌍 |
깨진 문자 / TypeError | 올바른 Base64URL |
코드 예시
JavaScript (브라우저) — 유니코드 안전
function toBase64Url(str) {
const bytes = new TextEncoder().encode(str);
const base64 = btoa(String.fromCharCode(...bytes));
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
Python 3 — 표준 라이브러리
AskPython에 따른 설명:
import base64
data = "Hello 세계! 🌍"
encoded = base64.urlsafe_b64encode(data.encode('utf-8')).decode('utf-8').rstrip('=')
print(encoded)
Node.js — Buffer 변환
const str = "API_Payload_Data";
const base64url = Buffer.from(str, 'utf8')
.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
문제 해결: 패딩 오류
| 오류 | 원인 | 해결 방법 |
|---|---|---|
binascii.Error: Incorrect padding |
= 패딩 누락 |
길이가 4의 배수가 될 때까지 = 추가 |
atob()에서 TypeError |
비 ASCII 문자 포함 | 먼저 TextEncoder 사용 |
| 출력이 깨짐 | UTF-8 인코딩 건너뜀 | Base64 전에 항상 바이트로 인코딩 |
AskPython에 따르면, 누락된 패딩 계산 방법: padding_needed = (4 - len(data) % 4) % 4, 그 다음 해당 개수만큼 = 문자를 추가합니다.
사용 사례: JWT와 Data URI
JWT (JSON Web Token) 구조
| 부분 | 내용 | 인코딩 방식 |
|---|---|---|
| 헤더 | 알고리즘 + 토큰 유형 | Base64URL |
| 페이로드 | 클레임 (사용자 데이터, 만료 시간) | Base64URL |
| 서명 | HMAC 또는 RSA 서명 | Base64URL |
JWT는 보통 eyJ로 시작합니다—이것은 {(JSON 여는 중괄호)의 Base64URL 인코딩입니다.

사용 사례별 Base64와 Base64URL 선택
| 사용 사례 | 인코딩 방식 | 패딩 |
|---|---|---|
| JWT 토큰 | Base64URL | 생략 |
| Data URI (임베디드 이미지) | 표준 Base64 | 필수 |
| HTTP Basic 인증 | 표준 Base64 | 필수 |
| URL 쿼리 매개변수 | Base64URL | 생략 |
결론
4단계: UTF-8 바이트 → Base64 → +/를 -_로 교체 → 패딩 제거. JavaScript에서는 TextEncoder를, Python에서는 base64.urlsafe_b64encode()를, Node.js에서는 Buffer를 사용하세요. RFC 4648을 준수하여 시스템 간 호환성을 확보하세요. Base64URL은인코딩이지 암호화가 아닙니다—보안을 위해서는 AES-256 또는 TLS를 사용하세요.
자주 묻는 질문
Base64URL은 암호화와 같은 건가요?
아닙니다.Base64URL은 가역적인 인코딩입니다—누구나 키 없이 디코딩할 수 있습니다. 민감한 데이터 보호에는 AES-256 또는 TLS/SSL을 사용하세요.
Base64URL이 표준 Base64 디코더에서 실패하는 이유는?
표준 디코더는 +, /, 그리고 = 패딩을 기대합니다. Base64URL은 -, _를 사용하고 패딩을 생략합니다. 디코딩 전에 문자 교체를 되돌리고 패딩을 복원해야 합니다.
JWT에서 패딩이 생략되는 이유는?
= 문자는 URL에서 %3D가 되어 문자열이 더 길어지고 읽기 어려워집니다. RFC 4648은 디코더가 패딩 마커 없이도 원래 길이를 재구성할 수 있으므로 생략을 허용합니다.

답글 남기기