개발 문서/기타

Base64란 무엇인가?

copg 2025. 3. 17. 11:59
728x90
반응형

Base64는 바이너리 데이터를 텍스트 형식으로 인코딩하는 방법 중 하나입니다. 이는 주로 바이너리 데이터를 이메일, 웹 페이지 등 텍스트 기반 환경에서 안전하게 전송할 때 사용됩니다. Base64라는 이름은 이 인코딩이 데이터를 표현할 때 64개의 문자(A-Z, a-z, 0-9, '+', '/')를 사용하기 때문에 붙여졌습니다.

왜 Base64를 사용하는가?

Base64 인코딩을 사용하는 주된 이유는 바이너리 데이터를 손상 없이 전송하거나 저장하기 위함입니다. 바이너리 데이터를 이메일이나 웹 페이지의 HTML, JSON 등과 같은 텍스트 기반 포맷에 직접 삽입하면 데이터가 깨지거나 오류가 발생할 수 있습니다. 따라서 바이너리 데이터를 Base64로 인코딩하여 안전하게 전송할 수 있도록 합니다.

주요 사용 사례는 다음과 같습니다:

  • 이미지나 파일 데이터를 HTML, CSS에 삽입하여 네트워크 요청 감소
  • 이메일 첨부 파일을 안전하게 전송
  • API 통신 시 바이너리 데이터를 JSON 형태로 전송

Base64 인코딩의 원리

Base64는 바이너리 데이터를 6비트씩 잘라서 ASCII 문자로 변환하는 방식으로 이루어집니다.

일반적으로 컴퓨터는 데이터를 8비트(1바이트) 단위로 처리합니다. Base64는 이 데이터를 6비트씩 나누어 표현하며, 데이터의 길이가 6비트로 나누어 떨어지지 않으면 '=' 문자를 추가하여 빈 공간을 채웁니다. 이러한 과정을 "패딩(padding)"이라고 합니다.

예시로 보는 인코딩 과정

다음은 간단한 문자열을 Base64로 인코딩하는 과정입니다:

텍스트: "Hi"

  1. ASCII로 변환하면:
    • H = 01001000
    • i = 01101001
  2. 바이너리로 연결하면: 01001000 01101001
  3. 6비트씩 나누면: 010010 000110 100100
  4. 각 6비트를 Base64 문자표에 대응하면:
    • 010010 = S
    • 000110 = G
    • 100100 = k
  5. 이때 24비트가 완전히 채워지지 않았다면 '='를 붙여 패딩하지만, 이 예에서는 정확히 나누어지므로 패딩이 필요 없습니다.

따라서, "Hi"는 Base64로 "SGk="로 나타냅니다.

Base64 문자표

Base64는 다음 64개의 문자를 사용합니다.

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
+/ (추가 문자)

패딩 문자로는 '='을 사용합니다.

장단점

장점

  • 바이너리 데이터를 안전하게 텍스트 형태로 전송 가능
  • 텍스트 기반 프로토콜(HTTP, SMTP 등)과 호환성

단점

  • 인코딩 시 데이터 크기가 약 33% 증가
  • 암호화가 아니므로 민감 정보 보호에는 적합하지 않음

Python에서 Base64 사용법

Python에서는 기본적으로 제공되는 base64 모듈을 사용하여 데이터를 인코딩 및 디코딩할 수 있습니다.

인코딩 예시

import base64

message = "Hello, World!"
message_bytes = message.encode('utf-8')
base64_bytes = base64.b64encode(message_bytes)
base64_message = base64_bytes.decode('utf-8')

print(base64_message)

디코딩 예시

import base64

base64_message = "SGVsbG8sIFdvcmxkIQ=="
base64_bytes = base64_message.encode('utf-8')
message_bytes = base64.b64decode(base64_bytes)
message = message_bytes.decode('utf-8')

print(message)

결론

Base64는 텍스트 기반 시스템에서 바이너리 데이터를 안전하게 처리할 수 있게 해주는 강력하고 유용한 도구입니다. 데이터를 주고받는 다양한 상황에서 효율적으로 활용하여 데이터 전송 문제를 해결할 수 있습니다.