Base64와 Base64UrlSafe 차이점 (Illegal base64 character 발생 이유)
Base64 encoding, decoding 기능을 사용하던 중 java.lang.IllegalArgumentException: Illegal base64 character 2b 예외가 발생했는데요.
해당 Exception은 Base64와 Base64 UrlSafe의 차이점을 제대로 알지 못하고 사용하였기 때문에 발생한 것이었으며, 해당 문제를 해결하면서 관련 내용을 함께 정리하였습니다.
* 결론을 먼저 말하자면 Base64 UrlSafe로 디코딩할 수 없는 문자를 디코딩하려고 했기 때문에 발생한 오류였습니다.
Base64란?
8비트의 이진 데이터(Binary Data)를 문자 코드에 영향을 받지 않는 공통 ASCII 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 말합니다.
Base64는 64진법이라는 뜻을 가지고 있는데요. 64는 2의 제곱수(2^6)이며, 2의 제곱수들에 기반한 진법들 중에서 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법입니다.
Base64는 알파벳 대문자 A-Z, 소문자 a-z, 숫자 0-9가 기본적으로 사용되며(여기까지 62개) 마지막 두 개를 어떤 기호를 사용하느냐에 따라 Base64에서 파생되는 종류가 달라지게 됩니다.
(기본적인 Base64의 경우 '+', '/' 두 가지 기호가 사용되며, Base64 UrlSafe의 경우 '-', '_' 기호가 사용됩니다.)
* ASCII, American Standard Code for Information Interchange, 미국 정보교환 표준 부호, 아스키코드
인코딩 과정
(3byte의 yml이라는 문자열을 base64로 인코딩하는 과정)
인코딩 되는 과정을 살펴보면, 각각의 문자에 대한 ASCII 코드의 십진법 값을 이진 데이터로 변환하여 6bit씩 자릅니다.
그리고 해당 6bit에 대한 10진법 값을 찾아 해당하는 값을 Index로 가진 Base64 코드를 적용합니다.
(2byte의 문자열 ym을 base64로 인코딩하는 과정)
위 예시의 문자열 yml(24bit)가 6자리 x 4로 떨어지지만 ym(16bit)의 경우 6자리로 딱 떨어지지 않는데요.
base64는 6bit 단위로 된 4개의 묶음이 하나의 반환 단위가 되는데, 이때 빈 공간의 경우 예시와 같이 padding('=') 값으로 대체됩니다.
* 당연한 것이지만 디코딩의 경우 인코딩의 반대 과정으로 진행됩니다.
Base64와 Base64 UrlSafe 차이점
앞에서 이야기한 것처럼 base64와 base64에서 파생된 나머지들의 차이점은 64개의 값들 중 62번째, 63번째에 사용되는 기호가 다르다는 것인데요.
Base64에서 사용되는 '+'와 '/' 기호가 '+' 기호는 띄어쓰기로 받아들여지고, '/' 기호는 경로 구분자로 받아들여지기 때문에 Base64로 인코딩 된 문자열을 url으로 전송하게 되면 정상적으로 전송되지 않는 문제점이 발생합니다.
따라서 이러한 문제를 막기 위해서 등장한 것이 바로 Base64 UrlSafe이며, Base64 UrlSafe에서는 '+', '/' 두 기호 대신 '-', '_'를 사용함으로써 위의 문제점이 발생하지 않게 되는 것입니다.
Illegal base64 character 오류 발생 원인
Illegal base64 character 오류의 발생 원인은 Base64 UrlSafe에서 디코딩할 수 없는 문자를 디코딩하려고 했기 때문에 발생한 것입니다.
String encryptedStr = "yZXFUaW 1lIjogMTI2NyNn0=";
String decryptedStr = new String(Base64Utils.decodeFromUrlSafeString(encryptedStr));
다음 경우와 같이 decoding 할 수 없는 '공백'이 포함되어 있을 때는 java.lang.IllegalArgumentException: Illegal base64 character 20 예외가 발생합니다.
공백 외에도 디코딩할 수 없는 '+' 문자가 포함되어 있는 경우에는 Illegal base64 character 2b 예외가 발생하며, '/' 문자가 포함된 경우에는 Illegal base64 character 2f 예외가 발생합니다.