내가 Toolz.dev 에 출하 Base64 변환기의 첫 번째 버전은 버그 I & #39;m 여전히 약간 당황했다. 그것은 내가 쓴 모든 테스트에서 완벽하게 작동 - 인코딩, 디코딩, 라운드 트립, 완료. 그런 다음 누군가가 이모티콘이 포함 된 텍스트를 붙여 넣기하고이있어:
Uncaught DOMException: InvalidCharacterError:
Failed to execute 'btoa' on 'Window': The string to be
encoded contains characters outside of the Latin1 range.
I'd는 텍스트 인코딩 도구를 구축했고 텍스트에 다음이 포함된다는 사실을 잊어버렸습니다 대부분의 텍스트. 모든 비 라틴어 스크립트,모든 악센트 문자,모든 이모티콘 - 깨진. 내 테스트는 모두 ASCII 했다 때문에 내가 생각 ASCII. 그 버그는 어떤 사양 읽기 보다 Base64 에 대해 더 많은 것을 가르쳐,그리고 I'll 당신에 게 나중에 수정 사항을 보여 때문에 그것은 터치 거의 모든 사람을 위로 트립 btoa().
Base64는 개발자가 매일 사용하는 것 중 하나입니다 - 모든 JWT, 모든 이메일 첨부 파일, 모든 data: URI - 후드 아래를 거의 보지 않는 동안. Let's look under the hood.
TL;DR: Base64 인코딩은 바이너리 데이터를 64 개의 안전한 ASCII 문자로 변환하여 JSON, URL, 이메일과 같은 텍스트 전용 채널을 통해 이동할 수 있도록 합니다 - ~33% 크기의 오버헤드를 희생하는 것입니다 아닙니다 암호화; 누구나 즉시 되돌릴 수 있습니다. 지금 바로 인코딩하거나 디코딩하려면 무료 클라이언트 측을 사용하세요 Base64 변환기 Toolz.dev 에서 - 귀하의 데이터는 브라우저를 떠나지 않으며,이는 you're 디코딩 토큰이 언제 중요한지 중요합니다.
Base64 인코딩이란 무엇입니까?
Base64 는 이진-텍스트 인코딩 체계입니다: 지금까지 구축된 모든 텍스트 시스템에서 살아남은 64 문자만 사용하여 임의의 바이트를 나타냅니다. 권위 있는 사양은 RFC 4648 (2006), 인코딩은 1993년에 RFC 1421 및 Privacy Enhanced Mail로 거슬러 올라가지만 Base64는 웹 브라우저보다 오래되었습니다.
알파벳:
A–Z→ 값 0~25a–z→ 값 26–510–9→ 값 52–61+→ 62,/→ 63=→ 패딩 (값이 아닌 필러)
왜이 64? ASCII,EBCDIC 및 지금까지 구축 된 모든 이메일 게이트웨이에서 엉킴없이 살아남기 때문입니다. Base64 는 수십 년간의 텍스트 전용 인프라를 갖춘 평화 조약입니다.
조약의 비용: 매 3 입력 바이트는 4 출력 문자 - 고정 33% 크기 세금이된다. 머리에 그 숫자를 유지; 그것은 실제 아키텍처 질문을 결정합니다.
Base64 알고리즘은 어떻게 작동합니까?
당신보다 짧은 대답'd 기대: 8s 에서 비트를 6s 로 재그룹화한 다음 테이블에서 찾아보십시오. 26 = 64 - that's 여기서 이름이 유래되었습니다.
부호화 Hi!:
1단계 - 바이트에서 비트까지.
| 캐릭터 | 아스키 | 이진 |
|---|---|---|
| H | 72 | 01001000 |
| 나 | 105 | 01101001 |
| ! | 33 | 00100001 |
연결됨: 010010000110100100100001- 24비트.
2 단계 - 6 비트 청크로 재편성.
010010 | 000110 | 100100 | 100001
18 | 6 | 36 | 33
3 단계 - 알파벳에서 각 값을 조회합니다.
18 → S, 6 → G, 36 → k, 33 → h. 그래서 Hi! 인코딩합니다 SGkh.
That's 전체 알고리즘. 조회 테이블을 넘어서는 수학 없음.
패딩 3 바이트의 aren't 배수인 입력을 처리합니다. 인코딩만 하면 됩니다 Hi (2바이트 = 16비트) 2비트 6비트 그룹만 채울 수 있습니다; 인코더는 비트를 0패드하고 추가합니다 = 필러의 양을 알리기 위해:
Hi → SGk= (2 bytes remaining → one '=')
H → SA== (1 byte remaining → two '==')
Hi! → SGkh (multiple of 3 → no padding)
내가 Toolz.dev 변환기에 대해 이것을 구현했을 때,패딩은 내 모든 오프 바이 원 버그가 살았던 곳이었습니다. 만약 당신이 이제까지 Base64 를 손으로 굴린다면 - 코딩 인터뷰를 위해,말하자면 - 패딩 테스트를 먼저 작성하십시오.
디코딩은 미러 이미지입니다: 문자를 다시 6비트 값으로 되돌리고, 8비트 바이트로 재편성하고, 패딩을 삭제합니다.

Base64로 실제로 어디로 달려가나요?
JWT - 큰 것
모든 JSON 웹 토큰은 점으로 연결된 세 개의 Base64URL 인코딩 세그먼트입니다: 헤더, 페이로드, 서명. auth 디버깅은 50%가 이를 디코딩합니다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
첫 번째 세그먼트를 디코딩하면 얻을 수 있습니다 {"alg":"HS256","typ":"JWT"}니다. 두 번째는 당신에게 주장을 제공합니다. 토큰이 잘못 행동 할 때 내 작업 흐름: 점에서 분할,에서 각 부분을 디코딩 Base64 변환기그런 다음 JSON을 에 붙여넣습니다 JSON 포맷터 제대로 읽으려면. 두 개의 페이스트, 그리고 당신은 여부를 알고 exp 주장은 당신의 문제다.
분명히 말할 가치가 있습니다: JWT 페이로드는 다음과 같습니다 토큰을 보유한 사람이 읽을 수 있습니다니다. 서명은 읽기가 아닌 변조를 중지합니다. I've 는 횡설수설한 모양이 개인 정보를 암시하기 때문에 중요한 데이터를 클레임에 채운 코드베이스를 검토했습니다. It does't.

데이터 URI
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
작은 자산을 인라인으로 포함하면 HTTP 요청을 저장합니다. 이미지가 많은 WordPress 관리자 UI 구축에서 내 경험 법칙: ~ 5 KB 이하로 가치가 있으며 10 KB 를 초과하면 you're 는 어쨌든 요청 HTTP/2 멀티 플렉스를 저장하기 위해 문서를 33% 팽창시킵니다.
쿠버네티스 비밀 - 그리고 호언장담
apiVersion: v1
kind: Secret
data:
password: cGFzc3dvcmQ= # decodes to "password"
쿠버네티스 비밀은 Base64 로 인코딩되어 있으며, 이것이 암시하는 거짓 보안은 놀라운 것이다. 그 값은 하나의 페이스트로 디코딩된다. Base64 는 여기에 존재하므로 이진 값은 YAML - a에서 살아남는다 포맷팅 보안이 아닌 결정. 당신의 비밀 이야기가 "they're Base64 in etcd, "에서 끝나는 경우 그것은 hasn't 시작.
목록의 나머지
HTTP 기본 인증 헤더(Authorization: Basic dXNlcjpwYXNz 일반으로 디코딩합니다 user:pass- 따라서 HTTPS 전용). MIME 을 통한 이메일 첨부 파일. JSON 페이로드 내부의 바이너리 블롭,JSON 에는 바이너리 유형이 없기 때문입니다.
Base64 암호화는?(아니오.제발, 아니오)
오해가 죽기를 거부하기 때문에 자체 섹션의 가치가 있습니다.
Base64는 a입니다 표현16 진수로 숫자를 쓰는 것과 같이 말이죠. 열쇠는 없습니다. 비밀은 없습니다. 해독은 RFC 4648 에서 공개적으로 인쇄된 알파벳 테이블 외에는 아무것도 필요하지 않습니다. 무엇이든 Base64-"protected"는 필기체로 작성되어 문자가 보호되는 방식으로 보호됩니다.
데이터의 기밀성이 필요한 경우: 적절하게 암호화합니다(AES-GCM 또는 libsodium) 그럼 채널이 텍스트를 필요로 하는 경우 Base64-암호화 텍스트를 인코딩합니다. 인코딩 및 암호화는 잘 구성됩니다 - 그들은 단지 aren't 대체물입니다. 그리고 비밀보다는 무결성이 필요한 경우 that's a hash's job - the 해시 생성기 SHA-256 및 친구를 다룹니다.
Base64는 Hex, URL 인코딩 및 Base85와 어떻게 비교됩니까?
| 베이스64 | 육각 (Base16) | URL/퍼센트 인코딩 | 아스키85 | |
|---|---|---|---|---|
| 크기 오버헤드 | +33% | +100% | 0~200%, 함량에 따라 다름 | +25% |
| 알파벳 | 64자 | 16자 | 아스키 + %XX 탈출하다 |
85자 |
| 사람이 읽을 수 있는 출력 | 아니요 | 일종의 바이트 경계가 표시됩니다 | 대부분 ASCII 입력용입니다 | 아니요 |
| 기본적으로 URL 안전 | 아니요 (+, /, =) |
예 | 네, 정의상 그렇습니다 | 아니요 |
| You'에서 만나게 될 것입니다 | JWT, MIME, 데이터 URI | 해시, MAC 주소, 색상 코드 | 쿼리 문자열 | PDF 내부 |
내가 선택하는 방법: 육각 인간이 체크섬, 다이제스트, 안구로 디버깅된 모든 항목 등 출력을 읽거나 비교할 때. 백분율 인코딩 URL 텍스트의 경우 바이너리가 아닙니다. 베이스64 텍스트 채널을 교차하는 이진법의 경우 - 대부분의 실제 사례. 아스키85 결코 자발적으로; 8% 절약은 아직 호환성 문제를 정당화하지 못했습니다.
URL-Safe Base64란 무엇이며 왜 존재합니까?
표준 Base64에는 문제가 있습니다: + "space"를 의미합니다. 쿼리 문자열에서 / 는 경로 구분자, = 매개변수를 구분합니다. URL 에 standard-Base64 토큰을 넣으면 어딘가에 있는 일부 미들웨어가 그것을 망칠 것입니다 - 간헐적으로,그리고 프로덕션에서만. 어떻게 아는지 물어보십시오.
RFC 4648 섹션 5 는 일반적으로 Base64URL 이라고 불리는 수정 사항을 정의합니다:
| 표준 | URL 안전 |
|---|---|
+ |
- |
/ |
_ |
= 패딩 |
보통 그냥 생략 |
동일한 알고리즘, 두 문자가 교환, 패딩이 삭제되었습니다. JWT는 Base64URL을 독점적으로 사용합니다. 이것이 바로 JWT 세그먼트를 엄격한 표준 Base64 디코더에 붙여넣는 것이 때때로 실패하는 이유입니다 - 또는 _. 그만큼 Toolz.dev 변환기 두 변종을 모두 처리합니다. 왜냐하면 실제 Base64 isn't의 절반을 거부하는 디코더가 디코더의 상당 부분을 차지하기 때문입니다.
경험 법칙: 인코딩된 문자열이 URL, 파일 이름 또는 HTTP 헤더에 닿는 경우 처음부터 URL 안전 변형을 사용하십시오. 개조란 찾기 및 바꾸기와 기도를 더한 것입니다.
코드에서 어떻게 인코딩하고 디코딩합니까?
자바스크립트 - 내가 빠진 함정
Here's 순진한 버전, 내가 배송한 버전:
btoa('Hello') // "SGVsbG8=" — great!
btoa('café ☕') // InvalidCharacterError — the bug from my intro
btoa 현대 유니코드 처리보다 앞서며 Latin-1 만 허용합니다. 올바른 현대 접근 방식은 명시적으로 UTF-8 바이트를 거칩니다:
// Encode: string → UTF-8 bytes → Base64
const bytes = new TextEncoder().encode('café ☕');
const encoded = btoa(String.fromCharCode(...bytes)); // "Y2Fmw6kg4piV"
// Decode: Base64 → bytes → string
const decoded = new TextDecoder().decode(
Uint8Array.from(atob(encoded), c => c.charCodeAt(0))
); // "café ☕"
(Node.js에서는 행사를 건너뛰세요: Buffer.from(str, 'utf8').toString('base64').)
파이썬
import base64
encoded = base64.b64encode('café ☕'.encode('utf-8')).decode('ascii')
decoded = base64.b64decode(encoded).decode('utf-8')
# URL-safe variant — note -_ instead of +/
token = base64.urlsafe_b64encode(b'binary\xfb\xff').decode('ascii')
파이썬은 옳은 것을 명백하게 만듭니다: 당신 반드시 바이트를 통과하십시오,그래서 encode-to-UTF-8 단계는 can't 잊혀지십시오. 나는 소원합니다 btoa 같은 척추로 디자인되었습니다.
PHP
$encoded = base64_encode('café ☕'); // handles bytes as-is — PHP strings ARE bytes
$decoded = base64_decode($encoded);
// URL-safe requires manual translation — a WordPress-plugin-developer classic:
$urlSafe = rtrim(strtr($encoded, '+/', '-_'), '=');
그 strtr/rtrim line 은 WP Adminify 를 포함하여 모든 PHP 코드베이스 I & # 39;에 작업 한 적이 있습니다. PHP 는 내장 된 URL 안전 변형을 얻지 못했기 때문에 우리 모두는 동일한 두 줄을 계속 작성합니다.
자주 묻는 질문
base64 인코딩은 무엇에 사용됩니까?
그것은 단지 텍스트를 처리하는 시스템을 통과 할 수 있도록 ASCII 텍스트로 바이너리 데이터를 변환: JSON 페이로드,URL, 이메일 (MIME), HTTP 헤더. 당신은 JWT 토큰에서 가장 자주 충족, data: 인라인 이미지,Kubernetes Secrets,파일을 운반하는 API 페이로드를 위한 URI. It's 는 저장소나 보안 형식이 아닌 전송 형식입니다.
Base64는 암호화와 동일합니까?
아니요, 그리고 두 가지를 혼동하면 실제 보안 사고가 발생합니다. Base64에는 키가 없습니다. 디코딩에는 공개 알파벳 테이블만 필요하며 어떤 테이블에도 하나의 붙여넣기가 필요합니다 디코더. 실제 알고리즘 (AES-GCM) 으로 먼저 암호화한 다음 채널에 텍스트가 필요한 경우 암호문을 인코딩합니다.
Base64가 데이터를 33% 더 크게 만드는 이유는 무엇입니까?
각 Base64 특성은 정보의 6 개 비트를 나르고 그러나 가득 차있는 8 비트 바이트를 점유합니다, 그래서 입력의 3 개 바이트는 항상 산출의 4 개의 특성 - 4/3 ≈ 1.33 가 됩니다. It's는 형의 조정 비용, 디자인으로 피할 수 없는 크기 문제인 경우에, 기호화 전에 압축하고, 결코 후에 - 암호로 고쳐 쓴 산출은 무작위로 보고 끔찍하게 압축합니다.
What's Base64와 Base64URL의 차이점?
Base64URL 스왑 + 위한 - 그리고 / 위한 _그리고 일반적으로 를 떨어뜨립니다 = 패딩, 그래서 출력은 탈출하지 않고 URL, 파일 이름, 헤더를 살아남습니다. 그렇지 않으면 RFC 4648 섹션 5 에 정의 된 동일한 알고리즘. JWT는 독점적으로 Base64URL을 사용합니다 - 엄격한 표준 - Base64 디코더가 때때로 그들을 질식하는 이유입니다.
왜 btoa()가 InvalidCharacterError를 던지나요?
문자열에는 이모티콘, 악센트 문자, 비서구 스크립트 등 Latin-1 외부의 문자가 포함되어 있습니다. btoa 는 감각적인 유니코드 처리보다 앞선 1990 년대 API 입니다. Encode to UTF-8 bytes first with TextEncoder, 다음 Base64 바이트; 생산 도구에 이 정확한 버그를 출하했으므로 판단하지 마십시오.
문자열이 Base64인지 어떻게 알 수 있나요?
유효한 Base64 는 오직 A–Z, a–z, 0–9, +, / (또는 -, _ URL 안전의 경우) 선택적 후행입니다 =,길이 that's 패딩되었을 때 4 의 배수. 하지만 평범한 단어들도 그 패턴과 많이 일치합니다 - cafe 는 가비지 바이트로 디코딩하는 유효한 Base64 입니다. 실제 테스트는 그것을 디코딩하고 출력이 의미 있는지 확인하는 것입니다.
Base64 문자열의 끝에 길 잃은 개행 문자가 있는 이유는 무엇입니까?
왜냐하면 echo 전에 하나를 추가합니다 base64 이제까지 그것을 본다, 그래서 echo "hunter2" | base64 7바이트가 아닌 8바이트를 인코딩합니다. 사용 printf 또는 echo -n 대신. 이것은 매니페스트에서 바로 보이고 런타임에 실패하는 쿠버네티스 시크릿의 제 1 원인이다: 디코딩된 암호는 보이지 않는 후행을 수반한다 \n. 그만큼 base64 명령은 또한 일부 시스템에서 출력을 76열로 래핑합니다. 패스입니다 -w 0 그것을 억제하기 위해 GNU coreutils 에.
JWT 토큰을 손으로 어떻게 디코딩합니까?
토큰을 두 점으로 나누고 첫 번째 세그먼트(헤더)와 두 번째 세그먼트(페이로드)를 가져와 각각 a를 통해 실행합니다 Base64 디코더- they're Base64URL, 그러니 수락하는 도구를 사용하십시오 - 그리고 _. 그런 다음 결과 JSON 을 a 로 포맷합니다 JSON 포맷터 주장을 읽으려면. 절대 생산 토큰을 서버측 도구에 붙여넣지 마십시오; 클라이언트측만.
이미지나 파일을 Base64로 인코딩하려면 어떻게 해야 합니까?
파일을 바이트로 읽은 다음 Base64 바이트를 읽고 다음과 같은 데이터 URI 헤더를 추가합니다 data:image/png;base64, 그래서 브라우저는 인라인으로 렌더링할 수 있습니다. 자바스크립트에서 FileReader.readAsDataURL() 두 단계 모두 수행합니까; 명령줄에서 base64 logo.png 원시 인코딩을 인쇄합니다. 작은 자산에 보관하십시오 - 33% 크기의 세금으로 인해 Base64 는 큰 모든 것에 적합하지 않으며 빅 데이터 URI는 HTML 또는 CSS를 부풀립니다.
JavaScript,Python 또는 터미널에서 Base64 를 어떻게 디코딩합니까?
최신 JavaScript에서는 유니코드를 안전하게 디코딩합니다 new TextDecoder().decode(Uint8Array.from(atob(str), c => c.charCodeAt(0))) 헐벗은 것보다 atob. 파이썬에서는 base64.b64decode(str) 바이트를 반환합니다 - call .decode('utf-8') 텍스트의 경우. 터미널에서, echo "aGk=" | base64 -d (또는 --decode). 세 가지 모두 표준 Base64 를 기대하므로 번역하십시오 -/_ 로 돌아갑니다 +// 먼저 만약 당신이're 처리 Base64URL 문자열.
테이크아웃
Base64 는 조용히 현대 웹의 반을 붙드는 30 년 오래 된 비트 셔플링 트릭입니다 - auth 토큰, 첨부 파일, 인라인 자산, secrets-that-aren't-secret. 6 비트 재편성을 이해하고, 33% 세금을 존중하며, 암호화를 위해 결코 착각하지 않으며, URL이 관련된 모든 곳에서 URL 안전 변형에 도달합니다. That's 실용적인 Base64 숙달의 95%.
실습 부분의 경우 Toolz.dev의 Base64 변환기 완전히 귀하의 브라우저에서 표준 및 URL 안전 인코딩을 수행-누군가가 하드 방법으로 유니코드 교훈을 배운 내장, 그래서 당신은 don't 해야 합니다.
이 시리즈의 추가 정보: 전체 코딩 도구 가이드 나머지 일일 운전자 유틸리티를 다룹니다 regex 빌더 가이드 다른 기술 개발자가 가지고 있는 척하는 문제를 해결하고 Base64 디버깅의 절반이 JSON으로 끝나기 때문에 궁극적 인 JSON 도구 가이드 는 자연스러운 다음 읽기.
관련 기사:



