Base64 와 Base64Url Safe

2025. 4. 1. 15:31·개발

 

Base64와 관련하여 개발을 진행하다가,

 

java.lang.IllegalArgumentException: Illegal base64 character 5f

 

와 같은 에러가 발생했다.

 

해당 오류는 Base64로 인코딩 된 데이터를 디코딩 할 때 발생했었는데, 원인을 알고보니 Base64Url Safe 로 인코딩한것을 Base64로 디코딩할려다가 발생한것이었다. 두개의 차이점은 뭘까?

 

Base64

우선 개념을 알아보자면, Base64 는 이미지와 같은 바이너리 데이터를 전송할 수 없는 환경에서 데이터를 인코딩하여 보내기 위해 사용된다. 예로 HTTP 요청, 이메일 환경등이 있다. 한마디로 바이너리 데이터를 읽을 수 있는 ASCII 데이터로 변환하는 과정이다.

 

인코딩 과정

"A" 라는 데이터를 인코딩해서 보낸다고 가정해보자.

 

1. 문자열을 바이너리 데이터로 변환

 

첫번째로 문자를 ASCII 코드로 변환한다음, 이를 바이너리 형태로 표기한다.

'A' 는 ASCII 코드로 65 , 이를 바이너리로 표현하면 0100 0001 가 된다.

 

ASCII 표

 

2. 6비트 단위로 분할

Base64는 3바이트(24비트) 단위로 데이터를 처리한다.

그리고 24비트를 6비트 단위로 나누어서 Base64 문자로 변환하는 과정을 거친다.

 

따라서 위 비트를 010000 , 01 과 같이 나누게 된다.

 

 

3. 패딩, 그리고 Base64 에 맞게 매핑

 

6비트로 정상적으로 나뉜 데이터는 Base64 색인표에 대응되는 문자로 매핑한다.

그러면 01 같은 경우에는? 나머지 비트를 0으로 채워준 후에 Base64 문자로 매핑한다.

 

base64 table

 

그러면 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 하게 인코딩하는것을 볼 수 있다.

'개발' 카테고리의 다른 글

JWT + Redis with 블랙리스트 (BlackList)  (0) 2025.06.17
[Java/Spring] Client IP 를 가져오는 법  (0) 2025.04.15
SMTP 란 ? (Java / Oracle 기반 구현 )  (0) 2025.03.03
[Oracle / Tibero ] Synonym 이슈 / Synonym이란?  (0) 2024.09.21
OAuth 회원가입, 로그인 유지를 어떻게 해야할까?  (0) 2023.11.06
'개발' 카테고리의 다른 글
  • JWT + Redis with 블랙리스트 (BlackList)
  • [Java/Spring] Client IP 를 가져오는 법
  • SMTP 란 ? (Java / Oracle 기반 구현 )
  • [Oracle / Tibero ] Synonym 이슈 / Synonym이란?
whiporithm
whiporithm
https://github.com/whipbaek
  • whiporithm
    whiporithm
    whiporithm
  • 전체
    오늘
    어제
    • 분류 전체보기 (176)
      • 개발 (17)
      • LeetCode (3)
      • 백준 (79)
      • 프로그래머스 (64)
      • 회고 (6)
      • 쉘 스크립트 (4)
      • 자바 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바알고리즘
    쉘스크립트
    카카오
    카카오코테
    자바코테
    파이썬코딩테스트
    Java
    카카오코딩테스트
    자바
    파이썬
    개발
    파이썬알고리즘
    파이썬코테
    프로그래머스
    백준
    코테
    알고리즘
    nestjs 배포
    코딩테스트
    쉘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
whiporithm
Base64 와 Base64Url Safe
상단으로

티스토리툴바