이메일을 보낼때를 생각해보자.
사실 생각해보면 우리는 이렇게 한글을 치고있지만, 컴퓨터는 101011111000101 ... 으로 변환해서 우리의 글을 저장하고, 그것을 보내게 된다.
이때 "A"를 65로 변환하는 것을 지난 포스트에서 이야기했다.
그렇다면.
이후에는 어떻게 변환되서 전달되는지 궁금해서 공부해보기로 했따.
Base 64란 말 그대로 64진법을 이용한다는 것이다.
a ~ z까지 26개, A~Z까지 26개, 0~9까지 10개, 거기에 + , / 를 더해서 총 64개의 문자로 데이터를 변환하는 것이다.
과정은 다음과 같다.
(1) 입력 데이터 분할: 원래 바이너리 데이터를 8비트씩 끊어 읽어들인 후, 3바이트씩(24비트) 그룹으로 나눔
(2) 비트 재배치: 각 24비트 그룹을 4개의 6비트 청크로 나눔. 6비트 청크는 0부터 63까지의 값을 나타낼 수 있다!
(3) 문자 매핑: 6비트 청크의 값을 64개 문자로 이루어진 사전에서 찾는다. 64개는 위의 설명과 같다.
(4) 패딩: 원래 데이터의 길이가 3바이트의 배수가 아닌 경우, 남은 비트에 패딩을 추가한다.
패딩은 '=' 문자로 표시되며, 결과 문자열의 길이가 4의 배수가 되도록한다.
자 이제 "hello !"를 base64로 변환해보자.
각 데이터를 ASCII 코드로 변환하면 다음과 같다.
'h': 104
'e': 101
'l': 108
'l': 108
'o': 111
' ': (스페이스): 32
'!': 33
이를 ASCII 코드를 8비트(1바이트)로 변환하면?
'h': 01101000
'e': 01100101
'l': 01101100
'l': 01101100
'o': 01101111
' ': 00100000
'!': 00100001
이제 24개씩 잘라보자.
'hel': 01101000 01100101 01101100
'lo ': 01101100 01101111 00100000
'!': 00100001 (패딩이 필요하므로 나중에 처리)
이걸 base64로 변환하면
'hel': 26 6 37 44
'lo ': 27 6 60 32
거의 다왔다. 이걸 문자로 변환해주자.
'hel': a G V s
'lo ': b G 8 g
마지막으로 패딩을 더해주고 합쳐주면~~~
aGVsbG8gIQ==
이런 과정을 거치게 된다.
원본 데이터에 비해서 용량도 커지는 이 귀찮은 녀석을 왜하냐면,
(1) 다른 시스템과의 호환성
엥? "/"를 쓰면 URL에 혼란을 줄 수 있잖아요
정답이다.
그런 당신을 위해서 URL safe base 64 인코딩이 준비되어있다!
"+" -> "-" 로, "/" ->"_"를 변환하는 과정을 추가하여서, URL에 들어갈 시 혼란을 주는 일을 방지한다!
(2) 이미지나 바이너리 객체도 포함 가능
자 base64에 대한 내용은 여기서 끝!
근데 하다보니 "hello !"라는 녀석이 변환되는 과정까지는 알았지만, 이후에 어떻게 전달되는가?
에 대해서는 정확히 설명할 수 없었다. 다음시간에는 OSI 7 layer를 알아보는걸로 하자!