일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Pinpoint
- AWS EKS
- 기록으로 실력을 쌓자
- CKA 기출문제
- 공부
- PETERICA
- 티스토리챌린지
- kotlin
- kotlin spring
- 정보처리기사실기 기출문제
- Linux
- kotlin querydsl
- aws
- 오블완
- Kubernetes
- IntelliJ
- 정보처리기사 실기 기출문제
- Elasticsearch
- 코틀린 코루틴의 정석
- CloudWatch
- Spring
- CKA
- minikube
- AI
- kotlin coroutine
- Java
- MySQL
- 정보처리기사 실기
- APM
- mysql 튜닝
- Today
- Total
피터의 개발이야기
Base64 디코드 시 IllegalArgumentException 문제 본문
ㅁ 개요
JWT 토큰을 디코딩 하는 과정에서 에러가 발생하였다. 특정 유효한 Base 64 인코딩 문자열에 대해 Java11에서 Base64.decode가 실패가 발생하였다. 특정 사용자에게만 발생하는데, 토큰을 비교해 보면 특정 문자열인 _(언더바)가 들어가는 경우 에러가 발생하였다. 이를 분석한 과정을 정리하였다.
ㅁ 에러 내용
[authorization] [http-nio-8082-exec-42] [2023-06-08 15:50:19:1373892465] ^[[1;31mERROR^[[0;39m ^[[36mo.a.c.c.C.[.[.[.[dispatcherServlet]^[[0;39m - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
java.lang.IllegalArgumentException: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value. Expected the discarded bits to be zero.
at org.apache.tomcat.util.codec.binary.Base64.validateCharacter(Base64.java:429)
at org.apache.tomcat.util.codec.binary.Base64.decode(Base64.java:676)
at org.apache.tomcat.util.codec.binary.BaseNCodec.decode(BaseNCodec.java:362)
at org.apache.tomcat.util.codec.binary.BaseNCodec.decode(BaseNCodec.java:353)
at org.apache.tomcat.util.codec.binary.BaseNCodec.decode(BaseNCodec.java:379)
at org.apache.tomcat.util.codec.binary.Base64.decodeBase64(Base64.java:172)
ㅇ java.lang.IllegalArgumentException: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value. Expected the discarded bits to be zero.
ㅇ 토큰의 Base64 디코드 시 마지막 문자열이 맞지 않다는 오류가 발생하였다.
ㅁ 에러 내용 검색, 아파치 이슈 확인
ㅇ 아파치 이슈 CODEC-279에 동일한 에러 메시지가 나타나 있었다.
ㅇ Decode를 위한 동일한 공통 코드 버전이 Java 8에서는 잘 작동하지만 Java 11에서는 실패하고 있다.
ㅇ Java 11 사용(AdoptOpenJDK 13.0.1.hs-adpt). 동일한 코드가 Java 8(AdoptOpenJDK 8.0.232.hs-adpt)을 통과
ㅇ 인코드와 디코드 시 사용하는 라이브러리가 차이가 날 때에 발생하는 IllegalArgumentException에 대해 구체적으로 설명해 주는 블러그를 찾았다.
ㅇ 기본 Base 64 알파벳 은 더하기(+)와 슬래시(/) 문자를 인식할 수 있다.
ㅇ Base 64 URL 알파벳은 빼기(-) 및 밑줄(_) 문자를 인식할 수 있다.
ㅁ 해결방법
문자열이 인코딩된 방법(기본 Base 64 또는 Base 64 URL 인코딩 사용)에 따라 선택한 알파벳의 모든 문자를 포함할 수 있다. 하지만, 하나의 알파벳으로 인코딩된 문자열은 다른 알파벳의 디코딩 시스템을 사용하여 디코딩되지 않을 수 있습니다. 디코더가 인식할 수 없는 문자를 읽으려고 하면 잘못된 base64 문자 오류 메시지를 보낸다.
JWT 디코딩 로직 중에 Base64로 디코딩하면서 언더바를 인식하지 못하여 발생하는 문제였다. 이는 자바 11버젼에만 발생하는 문제여서 이를 해결하기 위해서 인코딩과 디코딩을 Base64로 할 수 있도록 변경작업을 수행하였다.
'Programming > JAVA' 카테고리의 다른 글
[JAVA] JDK21, Virtual Thread, Continuation에 대한 이해 (0) | 2024.05.09 |
---|---|
[리액터] 리액티브 프로그래밍 2부 Flux와 Mono, 백기선님의 동영상을 보고 (0) | 2023.07.02 |
JAVA 조직도 트리구조 만드는 재귀코딩 (0) | 2023.05.08 |
[Java] 정규식 사용법 정리, Pattern, Match (1) | 2023.02.17 |
[JAVA] 코드 컨벤션의 필요성,IntellJ 코드 컨벤션 설정 (0) | 2023.02.14 |