Base64 인코딩 디코딩을 사용하는 이유

반응형

Base64 인코딩/디코딩을 사용하는 핵심 이유는 바이너리 데이터를 텍스트 형태로 안전하게 전달하기 위해서입니다.

예를 들어 이미지, DICOM, PDF, 인증서, 암호화 키 같은 데이터는 원래 바이너리 데이터입니다. 그런데 HTTP, JSON, XML, 이메일, URL, 로그 시스템 등은 보통 텍스트 중심으로 데이터를 다루기 때문에 바이너리를 그대로 넣으면 깨지거나 전송 중 문제가 생길 수 있습니다. 이때 Base64로 인코딩하면 바이너리를 A-Z, a-z, 0-9, +, /, = 같은 문자 조합으로 바꿔서 안전하게 전달할 수 있습니다.

대표적인 사용 이유는 다음과 같습니다.

  1. JSON/XML 안에 파일 데이터를 넣기 위해
    {
      "fileName": "image.png",
      "fileData": "iVBORw0KGgoAAAANSUhEUgAA..."
    }
    
    이런 식으로 이미지나 문서를 Base64 문자열로 넣을 수 있습니다.
  2. JSON은 문자열은 잘 다루지만, 바이너리 파일 자체를 직접 넣기 어렵습니다.
  3. HTTP API에서 바이너리 데이터를 안전하게 전송하기 위해예를 들어:서버에서는 다시:
  4. byte[] bytes = Convert.FromBase64String(base64);
  5. byte[] bytes = File.ReadAllBytes("test.dcm"); string base64 = Convert.ToBase64String(bytes);
  6. API 요청/응답에서 파일을 텍스트 필드로 포함해야 할 때 사용합니다.
  7. URL, 이메일, 토큰, 인증 정보 등에 포함하기 위해
  8. 일부 시스템은 특수문자나 바이너리를 허용하지 않기 때문에 Base64로 변환해서 전달합니다. JWT 토큰도 내부적으로 Base64URL 인코딩을 사용합니다.
  9. 문자 인코딩 문제를 피하기 위해
  10. 시스템마다 UTF-8, EUC-KR, ASCII 등 문자 인코딩 처리가 다를 수 있습니다. 바이너리 데이터를 그대로 문자열처럼 다루면 깨질 수 있는데, Base64는 비교적 안전한 ASCII 문자로 바꿔줍니다.

다만 중요한 점은 Base64는 암호화가 아닙니다. 누구나 디코딩할 수 있습니다.

hello → aGVsbG8=

위 문자열은 쉽게 다시 hello로 복원됩니다. 그래서 비밀번호나 개인정보를 보호하려는 목적이라면 Base64가 아니라 암호화, 해싱, HTTPS 등을 사용해야 합니다.

또한 Base64는 원본보다 데이터 크기가 약 33% 정도 커집니다. 그래서 큰 파일을 많이 전송할 때는 multipart/form-data, 파일 업로드 API, S3 presigned URL 같은 방식이 더 적합할 수 있습니다.

정리하면, Base64는 데이터를 숨기기 위한 기술이 아니라, 바이너리 데이터를 텍스트 환경에서 안전하게 주고받기 위한 인코딩 방식입니다.

반응형