Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python)으로 Base64 데이터 인코딩하기

Base64 모듈이란?

파이썬의 base64 모듈은 바이너리(binary) 데이터를 일반 텍스트 프로토콜로 전송하기에 적합한 ASCII 부분 집합으로 변환하는 기능을 제공합니다.

이 모듈의 인코딩·디코딩 함수는 Base16, Base32, Base64 알고리즘을 정의하는 RFC 3548 사양과, 사실상 표준(de-facto standard)인 Ascii85, Base85 인코딩 방식을 구현합니다. RFC 3548 인코딩은 바이너리 데이터를 이메일로 안전하게 전송하거나, URL의 일부로 사용하거나, HTTP POST 요청에 포함시킬 때 유용합니다.

모듈이 제공하는 최신(modern) 인터페이스는 bytes류 객체를 ASCII bytes로 인코딩하고, ASCII를 포함하는 bytes류 객체나 문자열을 bytes로 디코딩합니다. 지원되는 Base64 알파벳은 RFC 3548에 정의된 표준 방식과 URL·파일 시스템에 안전한(url-safe) 방식 두 가지입니다.

주요 인코딩/디코딩 함수

b64encode()와 b64decode()

  • base64.b64encode(): bytes류 객체를 Base64로 인코딩하여 인코딩된 bytes를 반환합니다.
  • base64.b64decode(): Base64로 인코딩된 bytes류 객체 또는 ASCII 문자열 s를 디코딩하여 디코딩된 bytes를 반환합니다.

b64encode()와 b64decode() 함수의 동작을 확인하기 위해 먼저 파이썬 문자열을 인코딩해 보겠습니다.

>>> import base64
>>> string = 'Python programming'
>>> enc_string = string.encode()
>>> enc_string
b'Python programming'

encode() 메서드는 문자열을 bytes 객체로 변환합니다. 이제 이 bytes 객체를 b64encode() 함수로 인코딩합니다.

>>> b64_estring = base64.b64encode(enc_string)
>>> b64_estring
b'UHl0aG9uIHByb2dyYW1taW5n'

decode() 함수를 사용하면 이 bytes 객체에서 문자열을 얻을 수 있습니다.

>>> dec_string = b64_estring.decode()
>>> dec_string
'UHl0aG9uIHByb2dyYW1taW5n'

다시 encode() 함수를 호출하면 bytes 객체가 반환됩니다.

>>> b1 = dec_string.encode()
>>> b1
b'UHl0aG9uIHByb2dyYW1taW5n'

이제 b64decode() 함수로 디코딩해 보겠습니다.

>>> d = base64.b64decode(b1)
>>> d
b'Python programming'

마지막으로 위 bytes 객체를 decode() 하면 원래 문자열을 얻을 수 있습니다.

>>> originalstring = d.decode()
>>> originalstring
'Python programming'

URL에 안전한 인코딩: urlsafe_b64encode() / urlsafe_b64decode()

표준 Base64 알파벳은 +/ 문자를 사용할 수 있습니다. 이 문자들이 URL에 포함될 경우 문제가 될 수 있으므로, 대체 인코딩 방식을 사용해야 합니다.

  • urlsafe_b64encode(): URL 및 파일 시스템에 안전한 알파벳으로 bytes류 객체를 인코딩합니다. 표준 Base64 알파벳에서 + 대신 -를, / 대신 _를 사용하며, 인코딩된 bytes를 반환합니다.
  • urlsafe_b64decode(): URL 및 파일 시스템에 안전한 알파벳으로 bytes류 객체 또는 ASCII 문자열을 디코딩하여 디코딩된 bytes를 반환합니다.

레거시(Legacy) 인터페이스: 파일 입출력

레거시 인터페이스는 파일 객체를 직접 인코딩·디코딩하는 함수를 제공합니다.

  • base64.encode(input, output): 바이너리 입력 파일의 내용을 인코딩하여 그 결과(Base64 인코딩 데이터)를 출력 파일에 씁니다. input과 output은 반드시 파일 객체여야 하며, input은 input.read()가 빈 bytes 객체를 반환할 때까지 읽습니다.
  • base64.decode(input, output): 바이너리 입력 파일의 내용을 디코딩하여 그 결과(바이너리 데이터)를 출력 파일에 씁니다. input과 output은 반드시 파일 객체여야 하며, input은 input.readline()이 빈 bytes 객체를 반환할 때까지 읽습니다.

파일 인코딩 실습

먼저 'wb'(바이너리 쓰기) 모드로 파일을 생성합니다.

>>> f1 = open('file.txt','wb')
>>> f1.write('Simple is better than complex'.encode())
>>> f1.close()

이제 base64.encode() 메서드로 파일을 인코딩합니다.

>>> f1 = open('file.txt','rb')
>>> f2 = open('file.dat','wb')
>>> base64.encode(f1,f2)
>>> f1.close()
>>> f2.close()

생성된 file.dat 파일을 메모장으로 열면 다음과 같은 내용이 보입니다.

U2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXg=

file.dat를 filenew.txt로 디코딩하려면 decode() 함수를 사용합니다.

>>> f1 = open('file.dat','rb')
>>> f2 = open('filenew.txt','wb')
>>> base64.decode(f1,f2)
>>> f1.close()
>>> f2.close()

디코딩이 완료되면 filenew.txt에서 원래 텍스트('Simple is better than complex')를 확인할 수 있습니다.