base64

Base64란?

Base64는 바이너리 데이터를 ASCII 문자로 인코딩하는 방법입니다. 주로 데이터를 **텍스트 기반 프로토콜(예: 이메일, JSON, XML)**로 전송하거나 저장할 때 사용됩니다. 바이너리 데이터를 Base64로 변환하면 데이터를 손실 없이 텍스트로 표현할 수 있습니다.


Base64 인코딩 과정

  1. 입력 데이터 변환:

    • 입력 데이터를 8비트 바이너리로 변환.

    • 예: "ABC" -> 01000001 01000010 01000011

  2. 비트 그룹화:

    • 데이터를 6비트 단위로 나눔. Base64는 6비트마다 하나의 문자로 매핑됨.

    • 예: 01000001 01000010 01000011 -> 010000 010100 001001 000011

  3. 64개의 문자로 매핑:

    • 각 6비트 값을 Base64 문자 집합으로 변환.

    • Base64 문자 집합:

      A-Z (26개), a-z (26개), 0-9 (10개), +, /
    • 예: 010000 -> Q, 010100 -> U, 001001 -> J, 000011 -> D

  4. 패딩 처리:

    • 입력 데이터 길이가 3의 배수가 아닌 경우, 마지막 6비트 단위의 데이터를 채우기 위해 **패딩 문자("=")**를 추가.

    • 예: "AB" (2바이트) -> QUJD==


Base64 디코딩 과정

  1. Base64 문자열을 6비트 단위로 변환.

  2. 6비트 단위를 8비트로 병합하여 원래의 바이너리 데이터를 복원.

  3. 패딩(=)은 복원 과정에서 제거.


Base64 변환 과정 예제

Python으로 Base64 변환

import base64

# 인코딩
data = "Hello, World!"
encoded = base64.b64encode(data.encode())
print("Base64 Encoded:", encoded.decode())

# 디코딩
decoded = base64.b64decode(encoded).decode()
print("Base64 Decoded:", decoded)

결과

Base64 Encoded: SGVsbG8sIFdvcmxkIQ==
Base64 Decoded: Hello, World!

Base64 결과는 항상 동일한가?

  1. 항상 동일한 결과:

    • 같은 입력 데이터라면 Base64 인코딩 결과는 항상 동일합니다. Base64는 결정적(Deterministic) 알고리즘이기 때문에 동일한 입력 -> 동일한 출력이 보장됩니다.

    • 예: "Hello"를 Base64로 인코딩하면 항상 SGVsbG8=가 나옵니다.

  2. 입력이 다를 경우:

    • 입력 데이터가 조금이라도 다르면 Base64 출력도 완전히 달라집니다.

  3. 패딩(=):

    • 입력 데이터 길이가 3의 배수가 아닌 경우 Base64 출력에 =가 추가됩니다.

    • 예:

      • "A" -> QQ==

      • "AB" -> QUI=

      • "ABC" -> QUJD

  4. URL-Safe Base64:

    • 표준 Base64 문자 집합에서 +/는 URL에서 문제가 될 수 있으므로, 이를 각각 -_로 바꾼 URL-Safe Base64도 존재합니다. 이 경우 결과 값은 표준 Base64와 다를 수 있습니다.

    • Python에서는 base64.urlsafe_b64encode를 사용.


Base64의 단점

  1. 출력 크기 증가:

    • Base64로 인코딩하면 데이터 크기가 약 33% 증가합니다.

    • 이유: 8비트를 6비트 단위로 변환하기 때문.

  2. 보안 목적에는 부적합:

    • Base64는 암호화가 아니며, 단순히 데이터를 변환하는 방법일 뿐입니다. 누구든 Base64 문자열을 디코딩할 수 있습니다.


Base64의 활용 사례

  1. 이메일 전송(MIME):

    • 이메일 첨부 파일을 Base64로 인코딩하여 텍스트로 변환한 뒤 전송.

  2. 웹 애플리케이션:

    • 이미지나 바이너리 데이터를 JSON이나 XML로 전송할 때 Base64를 사용.

  3. JWT(JSON Web Token):

    • JWT의 Header와 Payload는 Base64로 인코딩되어 전송됩니다.

  4. 데이터 URI:

    • HTML이나 CSS에서 인라인 이미지를 표현할 때 Base64 데이터 URI를 사용.

    html복사편집<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

Last updated