얼마전 회사에서 일을 하다가 우연히(?) 사용하게 된 "Base64"에 대해서 알아보고자 한다.
처음에는 암호화(encryption)를 한다고 생각했었다가 엄청 큰일 날뻔해서
더더욱 그 정체에 대해서 명확하게 파악해야겠다고 생각했었는데... 게으름에 이제서야 정리해본다.
▶ RFC 4648
base64는 base16, base32와 함께 2006년도에 'RFC 4648'에서 정의가 되어 있다.
- https://datatracker.ietf.org/doc/html/rfc4648
- 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으로 한 번 해보자!
string(text)을 binary 형태로 변경 후 base64 encoding 하고,
base64 encoding 된 결과물이 binary 형태이므로 print하기 위해서 string 형태로 변환해서 출력한다.
binary 형태인 base64 encoding 된 결과물을 가지고 base64 decoding을 하고,
마찬가지로 print하기 위해 string 형태로 변환해서 출력한다.
실행결과는 다음과 같다.
▶ 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을 참고해서 변환하면 된다.
그러면 다음과 같다.
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이 따로 있다.
- '+' → '-'
- '/' → '_'
나머지는 똑같다.
여기까지~~~~~!!!
'Programming > Algorithm' 카테고리의 다른 글
알고리즘 #1 - 정렬 문제 #4 - Heap Sort #1 (0) | 2024.01.20 |
---|---|
알고리즘 #1 - 정렬 문제 #3 - Merge Sort #1 (0) | 2024.01.06 |
알고리즘 #1 - 정렬 문제 #2 - Growth of Functions (0) | 2023.12.25 |
알고리즘 #1 - 정렬 문제 #1 - Insertion Sort #2 (0) | 2023.12.10 |
알고리즘 #1 - 정렬 문제 #1 - Insertion Sort #1 (0) | 2023.11.27 |