피드로 돌아가기
Dev.toBackend
원문 읽기
Base64 Encoding and Decoding Explained for Developers
Base64 인코딩이 이메일, JWT, 데이터 URL 등에서 널리 사용되는 이유와 정확한 작동 원리 설명
AI 요약
Context
모든 시스템이 임의의 바이너리 데이터를 안전하게 전송할 수 있는 것은 아니다. 이메일 프로토콜, URL, HTML 속성, 레거시 네트워크 프로토콜은 인쇄 가능한 ASCII 문자 텍스트만 안전하게 처리하도록 설계되었으며, 제어 문자나 null 바이트 같은 비인쇄 바이너리 값은 시스템을 손상시킬 수 있다.
Technical Solution
- 바이너리 데이터를 64개의 인쇄 가능한 ASCII 문자(A-Z, a-z, 0-9, +, /)로 변환하는 인코딩 스킴 도입
- 3바이트(24비트) 입력을 6비트씩 4개 그룹으로 분할한 후 Base64 알파벳 맵핑 수행
- 입력이 3바이트로 나누어떨어지지 않는 경우 1바이트 → "==" 패딩, 2바이트 → "=" 패딩 추가
- JWT 토큰, OAuth 플로우, URL 기반 데이터 전송에서 URL-safe Base64 사용(+ / /를 - / _로 치환)
- HTTP Basic Auth 헤더, MIME 이메일 첨부, JSON 바이너리 페이로드, PEM 인증서 등 6개 공통 용례에 적용
Impact
Base64 인코딩으로 인한 크기 증가는 약 33%이다. 구체적 예시: 100바이트 → 약 136 Base64 문자, 1KB(1024바이트) → 약 1.37KB, 1MB → 약 1.37MB.
Key Takeaway
Base64는 인코딩이지 암호화가 아니므로 trivially reversible하다. HTTP Basic Auth 사용 시 반드시 HTTPS를 함께 사용해야 한다. 대용량 파일 전송에는 33% 오버헤드로 인해 Base64가 부적합하며, multipart form data나 직접 파일 업로드를 대신 사용해야 한다.
실천 포인트
개발자가 "="로 끝나는 임의의 ASCII 문자열을 발견했을 때 Base64 Decoder로 콘텐츠를 즉시 확인할 수 있다. JWT 토큰의 헤더와 페이로드는 Base64URL로 인코딩되어 있으므로 (서명 제외) 디코딩하여 토큰 내용을 검사할 수 있다. MIME 표준에 따라 76자마다 개행이 삽입된 Base64 문자열을 파싱할 때는 디코딩 전에 정규식(r'\s+')으로 공백을 제거해야 한다.