얼마전 회사에서 일을 하다가 우연히(?) 사용하게 된 "Base64"에 대해서 알아보고자 한다.

 

처음에는 암호화(encryption)를 한다고 생각했었다가 엄청 큰일 날뻔해서

더더욱 그 정체에 대해서 명확하게 파악해야겠다고 생각했었는데... 게으름에 이제서야 정리해본다.

 

 

▶ RFC 4648

base64는 base16, base32와 함께 2006년도에 'RFC 4648'에서 정의가 되어 있다.

https://datatracker.ietf.org/doc/html/rfc4648

RFC 4648

 

- RFC (Request for Comments)

   : 컴퓨터 네트워크 공학 등에서 인터넷 기술에 적용 가능한 새로운 연구, 혁신, 기법 등에 대한 문서

 

▶ base64

base16, base32도 있지만 여기에서는 base64에 대해서만 살펴보겠다.

그러면, base64에서 64는 무엇을 의미할까!?

 

하나의 코드로 encoding할 수 있는 문자가 64개라는 의미이다.

64 = 2^6 이므로 base64의 하나의 코드는 6비트의 데이터를 표현할 수 있는 것이다. (64진수로 생각하면 된다)

 

그러면 base64의 하나의 코드는 64종류를 어떤 기호로 구분할까!?

 

일단 base64는 ASCII 텍스트로 표현하는데, 아래와 같이 총 64종의 문자를 사용한다.

 - 문자 A-Z    = 26

 - 문자 a-z     = 26

 - 숫자 0-9     = 10

 - 기호 '+', '/'   = 2

 

▶ Sample

실제로 어떻게 되는지 돌려볼까!?

우리의 친구 python으로 한 번 해보자!

python

 

string(text)을 binary 형태로 변경 후 base64 encoding 하고,

base64 encoding 된 결과물이 binary 형태이므로 print하기 위해서 string 형태로 변환해서 출력한다.

 

binary 형태인 base64 encoding 된 결과물을 가지고 base64 decoding을 하고,

마찬가지로 print하기 위해 string 형태로 변환해서 출력한다.

 

실행결과는 다음과 같다.

result

 

▶ base64 encoding

base64 encoding 과정을 수작업으로 훑어보자.

일단 몇 가지 문자에 대해 ascii code 값을 알아보자.

 

symbol DEC HEX BIN
w 119 77 0111 0111
h 104 68 0110 1000
a 97 61 0110 0001
t 116 74 0111 0100

 

그러면 다음과 같이 나열이 된다.

 

w             h               a               t

01110111 01101000 01100001 01110100

 

base64이므로 6bit 단위로 그룹핑 하고, 이것을 다시 십진수로 변경하면 다음과 같다.

 

011101     110110    100001    100001    011101    00

29             54           33            33            29

 

이 값을 변환할 기준은 RFC 4648 문서에 있는 table을 참고해서 변환하면 된다.

The Base 64 Alphabet

 

그러면 다음과 같다.

 

29   54   33   33   29

d     2     h     h     d

 

Python으로 작업한 결과와 동일하게 나오는 것을 확인할 수 있다.

 

여기에서도 뒤에 6개로 떨어지지 않는 부분이 있는 것을 알 수 있는데,

이것은 padding 처리해서 '='로 표기하게 된다.

 

(그러면 실제로는 65개 문자를 사용하니 Base65라고 해야하는 것 아닌가?! ^^)

 

▶ Usage

서두에서도 말을 했지만 Base64를 encryption 용도로 착각하기 쉽다.

하지만, encoding 과정을 잘 살펴보면 느꼈을 수도 있을텐데

Base64의 주요 용도는 binary 형태의 파일을 text 형태로 표현하는데에 있다.

 

즉, HTML 페이지를 구성할 때 jpg와 같은 그림 파일을 링크 형태가 아니라

HTML 파일 안에 text 형태로 저장할 수도 있게 되는 것이다.

 

그리고, 자주 봤을 아주 유용한 사례를 보자면, URL에 데이터를 포함해서 던질 때이다.

 

- https://app.whatwant.com/push?data=xxxxxxx 

 

위와 같이 URL 형식으로 binay 파일 내용을 전달하고 싶은 경우

Base64 encoding을 통해 가능해진다 !!!

 

▶ Base64URL

여기에서 여러분은 질문을 해야 한다 !!!

 

Base64 encoding 결과물을 URL에 정말 사용해도 되나요?

특수문자 '+', '/'를 사용하는데, 문제가 없나요?

 

그렇다!!!

 

URL에서 '+'는 공백을 위해 사용되고, '/'는 폴더 구분 용도로 사용된다.

 

그래서 그 2개의 특수문자를 변경한 Base64URL encoding이 따로 있다.

- '+' → '-'

- '/' → '_'

 

나머지는 똑같다.

 

 

여기까지~~~~~!!!

 

반응형

+ Recent posts