Base64는 언제 쓰고 언제 피해야 할까
Base64는 인코딩이지 암호화가 아닙니다. 즉, 누구나 쉽게 원문으로 복원할 수 있습니다. 그럼에도 실무에서 자주 쓰이는 이유는 바이너리 데이터를 텍스트 전송 경로에 안전하게 실을 수 있기 때문입니다. 문제는 이 차이를 잘못 이해하면 보안 사고나 성능 저하로 이어진다는 점입니다.
1) Base64가 적합한 경우
- 바이너리 데이터를 텍스트로 전달해야 할 때
- JSON/HTTP 헤더에 바이너리를 담아야 할 때
- 이메일/메시지에서 바이너리 전송이 어려울 때
- 외부 시스템과의 인터페이스가 문자열만 허용될 때
2) 피해야 할 경우
- 보안이 필요한 데이터(토큰, 비밀번호)
- 대용량 이미지/파일 (크기가 약 33% 증가)
- 저장 공간과 전송 비용이 중요한 환경
- 이미 바이너리 업로드가 가능한 API나 스토리지를 쓰는 경우
3) 자주 하는 실수
- Base64를 암호화로 착각
- 줄바꿈이 섞인 문자열을 그대로 디코딩
- 패딩(=) 누락으로 인한 복원 실패
- Base64URL과 일반 Base64를 혼동
4) 실무 팁
- 바이너리 전송이 가능하다면 그대로 보내는 것이 효율적입니다.
- Base64로 보낼 때는 길이 증가를 고려한 제한을 두세요.
- 로그에 Base64를 남길 때도 원문 노출 가능성을 고려해야 합니다.
5) 왜 크기가 커질까
Base64는 3바이트의 원본 데이터를 4개의 문자로 바꾸는 방식입니다. 그래서 일반적으로 약 33% 정도 크기가 증가합니다. 예를 들어 3MB 이미지를 Base64 문자열로 바꾸면 4MB 수준까지 커질 수 있습니다. 이 차이는 작은 테스트에서는 티가 안 나지만, 대량 업로드나 모바일 네트워크 환경에서는 체감됩니다.
6) 실무에서 자주 만나는 사례
가장 흔한 사례는 메일 첨부, data URL, API 테스트용 샘플 데이터입니다. 프론트엔드에서 캔버스 이미지를 data URL로 얻은 뒤 서버에 보내는 흐름도 자주 보입니다. 반대로 실제 운영 업로드 경로에서는 multipart/form-data나 오브젝트 스토리지를 쓰는 편이 더 효율적입니다. 즉, Base64는 "전송 제약을 우회하는 보조 수단"에 가깝고, 기본 저장 포맷으로 쓰기에는 비용이 큽니다.
7) Base64와 Base64URL 차이
JWT나 일부 URL 파라미터에서는 +, /, = 대신 URL에 안전한 문자를 쓰는 Base64URL 변형이 사용됩니다. 일반 Base64 디코더에 그대로 넣으면 실패하는 경우가 있으니 입력 포맷을 먼저 확인해야 합니다. 특히 JWT 디코딩과 일반 Base64 디코딩을 같은 규칙으로 처리하면 오류가 납니다.
8) 바로 써보기
Base64 Encode/Decode로 인코딩/디코딩을 확인하고 문자열이 정상 복원되는지 검증하세요.
9) 보안 관점에서의 정리
- Base64는 누구나 디코딩할 수 있으므로 비밀성은 없습니다.
- 토큰/비밀번호/PII는 Base64로 감추지 마세요.
- 보안이 필요하면 암호화(예: AES)나 전송 구간 보안(TLS)을 사용하세요.
10) 전송 비용 계산
Base64는 대략 33% 크기 증가가 발생합니다. 대용량 파일을 Base64로 보내면 네트워크/스토리지 비용이 커지므로 주의하세요.
11) 실패 사례로 보는 점검 포인트
이미지 미리보기가 가끔 깨진다면 문자열 중간이 잘렸는지, 줄바꿈이 삽입되었는지, 접두사(data:image/png;base64,)가 필요한 상황인지 먼저 확인하세요. 서버 저장 후 다시 읽을 때만 깨진다면 인코딩 단계보다 DB 칼럼 길이 제한이나 직렬화 처리 문제가 더 흔한 원인입니다.
12) 체크리스트
- 인코딩 대상이 정말 바이너리 데이터인가?
- Base64가 아닌 원본 전송이 가능한가?
- 디코딩 측에서 줄바꿈/공백을 제거하는가?
- 일반 Base64인지 Base64URL인지 확인했는가?
13) 운영 판단 기준
테스트 편의성 때문에 Base64를 채택했다면, 운영 단계에서도 그대로 유지할지 다시 점검하는 것이 좋습니다. 작은 내부 도구에서는 충분히 실용적일 수 있지만, 파일 크기 증가와 처리 비용이 중요한 서비스에서는 대부분 더 나은 대안이 있습니다.
14) 추가 예시
- 이미지/파일을 JSON에 넣어야 할 때 Base64를 사용합니다.
- 헤더 인증 정보는 Base64가 아니라 OAuth/JWT를 사용합니다.