Base64와 관련하여 개발을 진행하다가,
java.lang.IllegalArgumentException: Illegal base64 character 5f
와 같은 에러가 발생했다.
해당 오류는 Base64로 인코딩 된 데이터를 디코딩 할 때 발생했었는데, 원인을 알고보니 Base64Url Safe 로 인코딩한것을 Base64로 디코딩할려다가 발생한것이었다. 두개의 차이점은 뭘까?
Base64
우선 개념을 알아보자면, Base64 는 이미지와 같은 바이너리 데이터를 전송할 수 없는 환경에서 데이터를 인코딩하여 보내기 위해 사용된다. 예로 HTTP 요청, 이메일 환경등이 있다. 한마디로 바이너리 데이터를 읽을 수 있는 ASCII 데이터로 변환하는 과정이다.
인코딩 과정
"A" 라는 데이터를 인코딩해서 보낸다고 가정해보자.
1. 문자열을 바이너리 데이터로 변환
첫번째로 문자를 ASCII 코드로 변환한다음, 이를 바이너리 형태로 표기한다.
'A' 는 ASCII 코드로 65 , 이를 바이너리로 표현하면 0100 0001 가 된다.
2. 6비트 단위로 분할
Base64는 3바이트(24비트) 단위로 데이터를 처리한다.
그리고 24비트를 6비트 단위로 나누어서 Base64 문자로 변환하는 과정을 거친다.
따라서 위 비트를 010000 , 01 과 같이 나누게 된다.
3. 패딩, 그리고 Base64 에 맞게 매핑
6비트로 정상적으로 나뉜 데이터는 Base64 색인표에 대응되는 문자로 매핑한다.
그러면 01 같은 경우에는? 나머지 비트를 0으로 채워준 후에 Base64 문자로 매핑한다.
그러면 010000 010000 값이니까 위 표에 매핑하면 QQ 가 된다.
단, 이 경우에는 최소 데이터 단위인 3바이트, 24비트를 채울수가 없다.
따라서 남은 비트 부분은 패딩하여 보내준다. 패딩시에는 = 문자를 사용하여 보내게 되고
결과적으로 "QQ==" 라는 문자열을 보내게 된다.
Base64 Url Safe
가끔씩 Base64 인코딩한 데이터를 Url 에 써야할 수 있다.
Base64 문자 중에는 '+' 와 '/' 가 있는데 (위 base64 테이블 참조)
'+' 문자 같은 경우에는 Url 에서 공백을 나타내는데 사용하며,
'/' 는 경로 구분자로 사용하기 때문에 그대로 사용할 수 없다.
이 경우를 대비하여 Base64 Url Safe 라는것이 등장했다.
'+' 문자를 '-' 로, '/' 문자를 '_' 로 변경해서 사용하는것이다.
Java에서 Base64 클래스를 살펴보면,
위와같이 두 형태를 지니고 있는것을 볼 수 있다.
Java에서는 필요에 따라서 Encoder 를 가져와서 처리할 수 있다.
추가로, Url에 많이 사용되는 JWT 대표 라이브러리 jjwt를 살펴봐도
위와 같이 Url Safe 하게 인코딩하는것을 볼 수 있다.
'개발' 카테고리의 다른 글
SMTP 란 ? (Java / Oracle 기반 구현 ) (0) | 2025.03.03 |
---|---|
[Oracle / Tibero ] Synonym 이슈 / Synonym이란? (0) | 2024.09.21 |
OAuth 회원가입, 로그인 유지를 어떻게 해야할까? (0) | 2023.11.06 |
Nest JS 프로젝트 배포 자동화 하기 (3) - 스크립트 작성 (0) | 2023.11.05 |
Termius 로 ec2 ssh 접속하기 (0) | 2023.11.02 |