콘텐츠로 건너뛰기

Base64 encode 와 encodeUrlSafe 차이

Base64 인코딩을 사용하고 있는데, java.lang.IllegalArgumentException: Illegal base64 character 2b 오류가 발생하여 디버깅하다가 알게된 내용을 정리한다.

컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.
원래 Base 64를 글자 그대로 번역하여 보면 64진법이란 뜻이다. 특별히 64진법이 컴퓨터에서 흥미로운 것은, 64가 2의 제곱수(64 = 26)이며, 2의 제곱수들에 기반한 진법들 중에서 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이기 때문이다. 즉, 다음 제곱수인 128진법에는 128개의 기호가 필요한데 화면에 표시되는 ASCII 문자들은 128개가 되지 않는다.
그런 까닭에 이 인코딩은 전자 메일을 통한 이진 데이터 전송 등에 많이 쓰이고 있다. Base 64에는 어떤 문자와 기호를 쓰느냐에 따라 여러 변종이 있지만, 잘 알려진 것은 모두 처음 62개는 알파벳 A-Z, a-z와 0-9를 사용하고 있으며 마지막 두 개를 어떤 기호를 쓰느냐의 차이만 있다. 1

그런데 기존의 base64 mapping table을 보면, ‘+’와 ‘/’ 문자가 존재한다. 이런 문자들은 http 통신을 할 때에 각각 공백과 path로 오해할 수 있는 부분이라서 문제가 발생한다. 그래서 urlsafe방식이 나오게 되었는데, ‘+’문자와 ‘/’문자를 각각 ‘-‘문자와 ‘_’문자로 치환하여 사용한다.

mapping table이 다르기때문에, 같은 base64라 하더라도 urlsafe와 standard는 혼용하여 사용할 수 없다.

 

  1. https://ko.wikipedia.org/wiki/베이스64

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다