Python Base64)바이너리,인코딩,디코딩 제대로 이해하기

1. Base64를 사용 전 알아야 될 것

파이썬에서 base64를 사용하기 전 알아야될 것이 있다 컴퓨터는 우리가 보는 문자 그대로 저장하지 않고, 모든 데이터를 0과 1로 이루어진 바이너리 형태로 처리한다. 문자, 숫자, 토큰, 파일 모두 내부에서는 이진 데이터다. 문제는 이 바이너리 데이터를 그대로 네트워크나 파일에 사용하면 깨지거나 읽기 어렵다는 점이다. 그래서 바이너리를 문자 형태로 변환하는 방식들이 생겼고, Base64도 그중 하나다.



2. 바이너리와 인코딩·디코딩의 관계

  • 바이너리(Binary) 컴퓨터가 이해하고 저장하는 기본 데이터 형태로, 모든 문자는 내부적으로 0과 1의 조합으로 표현된다.

  • 인코딩(Encoding) 바이너리 데이터를 문자 기반 환경에서 사용할 수 있도록 변환하는 과정이다. Base64는 이 과정에서 64개의 안전한 문자 조합을 사용해 바이너리를 표현한다.

  • 디코딩(Decoding) 인코딩된 데이터를 다시 바이너리 형태 또는 원래의 문자열로 복원하는 과정이다.

추가로 Base64는 아래 특징을 가진다:

  • base64는 데이터를 부풀리게 되서 보통 암호화하고 인코딩을 하게된다 base64는 운송을 위한 포장일 뿐임
  • 인코딩된 값은 언제든지 디코딩을 통해 원본으로 되돌릴 수 있다.

오케이! 코드블록 없이 그냥 마크다운 텍스트 형식으로 다시 구성해줄게. (복붙해서 블로그에 바로 넣기 좋게)

3. Base64 인코딩과 디코딩 전체 흐름

파이썬에서 문자열을 Base64로 인코딩하고 다시 원래 상태로 디코딩하는 과정은 총 6단계로 나눌 수 있다. 좀 헷갈리긴 한다

import base64

# 1) 문자열 준비
text = "안녕 내일머해"

# 2) UTF-8 인코딩 (문자열 → bytes)
utf8_bytes = text.encode('utf-8')

# 3) Base64 인코딩 (bytes → Base64 bytes)
b64_bytes = base64.b64encode(utf8_bytes)

# 4) 사람이 볼 수 있는 문자열로 변환 (bytes → str)
b64_str = b64_bytes.decode('utf-8')
print("Base64 인코딩 결과:", b64_str)

# 5) Base64 문자열 → Base64 디코딩 (str → bytes)
decoded_bytes = base64.b64decode(b64_str)

# 6) UTF-8 디코딩 (bytes → 문자열)
decoded_text = decoded_bytes.decode('utf-8')
print("디코딩 결과:", decoded_text)


-단계별 이해

2) 문자열 → UTF-8 인코딩 (bytes 생성)

"안녕 내일머해" 같은 문자열은 컴퓨터가 직접 저장할 수 없기 때문에 UTF-8로 인코딩해서 바이너리(bytes) 형태로 변환한다. 이 결과는 출력할 때 16진수처럼 보이지만 실제 데이터는 바이너리이다.

예) b'\xec\x95\x88\xeb\x85\x95 \xeb\x82\xb4\xec\x9d\xbc\xeb\xa8\xb8\xed\x95\xb4'

3) UTF-8 bytes → Base64 인코딩

바이너리 데이터를 Base64로 한 번 더 인코딩하면 ASCII 문자만 포함된 형태의 bytes로 바뀐다.

예) b'7JWI64WVIOuCtOydvOuouO2VtA=='

여기서 주의할 점:

  • 내용은 ASCII 문자 조합
  • 타입은 여전히 bytes → 그래서 앞에 b가 붙음

4) Base64 bytes → 문자열(str)

Base64 인코딩 결과는 보기엔 문자열 같아도 타입은 bytes다. .decode('utf-8')을 적용하면 다루기 편한 문자열(str)로 바뀐다.

결과 예) "7JWI64WVIOuCtOydvOuouO2VtA=="

이제 b 표시는 사라진다.

5) 문자열 → Base64 bytes (복원 준비)

디코딩을 하기 위해서는 문자열 형태의 Base64 값을 다시 bytes로 바꿔야 한다.

"7JWI64WVIOuCtOydvOuouO2VtA==" → .encode('utf-8') → b'7JWI64WVIOuCtOydvOuouO2VtA=='

6) Base64 디코딩 → UTF-8 디코딩

  1. base64.b64decode()로 Base64 bytes를 원래 UTF-8 바이너리로 되돌린다.
  2. .decode('utf-8')을 사용하면 최종 문자열로 복원된다.

최종 결과: "안녕 내일머해"

-인코딩/디코딩 전체 흐름 요약

→ 문자열(str) → UTF-8 인코딩 → bytes → Base64 인코딩 → Base64 bytes → UTF-8 디코딩 → Base64 문자열(str) → UTF-8 인코딩 → Base64 bytes → Base64 디코딩 → UTF-8 bytes → UTF-8 디코딩 → 문자열(str)

좋아! 그럼 옵션 C(환경설정/설정 값 예제)를 기반으로, 3번과 겹치지 않게 이해 중심+실무 감각 살린 스타일로 소제목 4 + 마무리를 완성형으로 작성해줄게.

4. 환경 설정값을 Base64로 감싸는 실용 예제

Base64는 JSON이나 파일처럼 복잡한 데이터가 아니어도, 간단한 문자열이나 설정값을 임시로 감싸는 용도로도 많이 사용된다. 대표적으로 환경 변수, 설정 파일, 임시 토큰, 테스트용 데이터 등이다.

민감 정보를 숨기기 위한 목적으로 쓰는 경우도 있지만, 이건 암호화가 아니라 “노출 방지 수준의 포장” 정도이며 url파라미터나 http헤더 등에서 민감한 부분에서 에러를 유발 할 수도 있으니 사용하기도 한다

예제 코드

import base64

# 1) 설정값이나 환경정보라고 가정
config = "host=localhost;user=admin;pwd=1234"

# 2) 문자열 → UTF-8 인코딩 → Base64 인코딩
encoded = base64.b64encode(config.encode('utf-8')).decode('utf-8')
print("Base64 인코딩 결과:", encoded)

# 3) Base64 문자열 → 다시 디코딩
decoded = base64.b64decode(encoded).decode('utf-8')
print("디코딩 결과:", decoded)

실행 흐름 설명

  1. 일반 문자열 상태의 설정값이 UTF-8를 통해 bytes로 변환된다.
  2. 이 bytes를 Base64로 인코딩하면 ASCII 문자로만 이루어진 문자열 형태가 된다.
  3. .decode('utf-8')을 거치면 b''가 제거된 순수 문자열 타입이 된다.
  4. 다시 디코딩하면 언제든지 원래 문자열로 복원된다.

출력되는 Base64 문자열은 얼핏 보면 감춰진 값처럼 보이지만, 누구나 쉽게 디코딩해서 원래 데이터를 볼 수 있다. 그래서 “보안 목적”이 아니라 “전달이나 저장 시 형태를 맞추기 위한 변환”으로 이해하는 것이 정확하다.

5. 마무리

Base64는 데이터를 안전하게 숨기는 기술이 아니라, 문자 기반 환경에서도 바이너리를 무손실로 표현하기 위한 인코딩 방식이다.

  • 문자열은 UTF-8로 먼저 bytes로 바뀐다.
  • Base64는 그 bytes를 ASCII 문자 기반 표현으로 다시 변환한다.
  • 언제든지 역순으로 디코딩하면 원래 상태로 되돌릴 수 있다.
  • 설정값, JSON, 토큰, 파일 데이터 등 다양한 곳에서 활용되지만 “보안” 목적은 아니다.

이 흐름만 이해하면 이후에 파일 처리, API 전송, 토큰 구조 분석 같은 실무 상황에도 충분히 응용할 수 있다.

이전최근

댓글 쓰기