hello world

illegal base64 character 20 오류 본문

WEB/error_log

illegal base64 character 20 오류

sohyun_92 2021. 7. 28. 13:36
728x90

전에 개발했던부분에서 오류발견.. 토큰값을 암복호화하는데 자꾸 오류가 난다., 찾아보니

 

https://www.freeism.co.kr/wp/archives/1022

 

Base64 encode 와 encodeUrlSafe 차이 - ThinkCUBES

Base64 인코딩을 사용하고 있는데, java.lang.IllegalArgumentException: Illegal base64 character 2b 오류가 발생하여 디버깅하다가 알게된 내용을 정리한다. 컴퓨터 분야에서 쓰이는 Base 64 (베이스 육십사)란 8비

www.freeism.co.kr

 

기존의 base64 mapping table을 보면, ‘+’와 ‘/’ 문자가 존재한다.

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


로그를 더 찾아보니 '+' 문자를 공백으로 인식하고 복호화를 진행해서 생기는 오류였다.

서버쪽에서 아래와 같이 Base64Utils.encodeToUrlSafeString 으로 바꿔주면

+- 가 포함된 문자를  ‘-‘문자와 ‘_’문자로 치환하여 암복호화를실행한다.

Base64.getEncoder().encodeToString(str.getBytes()); ->Base64Utils.encodeToUrlSafeString(sample.getBytes());

Base64.getDecoder().decode(str.getBytes()); ->  Base64Utils.decodeFromUrlSafeString(encoded2)

 

근데 나는 클라이언트 부분에서 이미 encodeURI(token); 을 사용한게 문제였다. ...

 

encodeURL 함수는  ; / ? : @ & = + $ , - _ . ! ~ * ' ( ) # & 문자를 인코딩 하지 않는다고 한다.

그래서 encodeURIComponent 을 사용해줘야 위와 같은 오류를 방지할 수 있다.

encodeURIComponent 를 사용할경우  ; / ? : @ & = + $ , - _ . ! ~ * ' ( ) # & 를 %로 치환한다.

 

encodeURI(token) -> encodeURIComponent(token) 

 

;;삽질 끝

 

 

 

 

 

Comments