Base64 패딩(=) 오류: 왜 JWT에서 사라지고 디코딩에 실패하는가
Base64 인코딩을 하다 보면 문자열 끝에 '=' 문자가 붙는 것을 자주 보게 됩니다. 이 '='는 패딩(Padding) 문자인데, 때로는 보였다가 때로는 사라져서 디코딩 오류를 유발하기도 합니다. 특히 JWT(JSON Web Token) 같은 웹 환경에서는 패딩이 의도적으로 생략되는 경우가 많아 주의가 필요합니다.
1) Base64 패딩의 역할
Base64는 3바이트(24비트)의 이진 데이터를 4개의 Base64 문자로 표현하는 인코딩 방식입니다. 입력 데이터의 길이가 3의 배수가 아닐 때, 마지막 그룹을 3바이트로 채우기 위해 0으로 패딩하고, 이 부분을 '=' 문자로 표시합니다.
- '=' 하나: 마지막 그룹이 2바이트일 때 (예: 2바이트 -> 16비트 -> Base64 3문자 + '=' 1문자)
- '==' 두 개: 마지막 그룹이 1바이트일 때 (예: 1바이트 -> 8비트 -> Base64 2문자 + '==' 2문자)
2) Base64URL에서 패딩이 사라지는 이유
일반 Base64는 URL에 사용할 수 없는 '+', '/', '=' 문자를 포함합니다. Base64URL은 이 문제를 해결하기 위해 '+'를 '-'로, '/'를 '_'로 바꾸고, 특히 '=' 패딩 문자를 생략합니다. 이는 URL의 길이를 줄이고, URI 파서에서 충돌을 피하기 위함입니다.
- JWT의 경우: JWT는 웹 전송을 위해 Base64URL을 사용하므로, 토큰 세그먼트에는 보통 패딩 '='가 붙어있지 않습니다.
3) 패딩 누락으로 인한 디코딩 실패
패딩이 생략된 Base64URL 문자열을 일반 Base64 디코더로 처리하거나, 패딩 복원 로직 없이 처리하면 다음과 같은 오류가 발생할 수 있습니다.
- "Invalid character" 또는 "Input not base64 valid"
- "Padding missing or incorrect"
- "Unexpected end of data"
4) 패딩 복원 방법
패딩이 생략된 Base64URL 문자열은 길이를 4의 배수로 맞추어 '='를 추가해 주면 대부분의 Base64 디코더에서 정상적으로 처리됩니다.
- 길이 확인: 입력 문자열의 길이를 확인합니다.
- 나머지 계산:
길이 % 4를 계산합니다. - 패딩 추가: 나머지가 2이면 '==', 3이면 '='를 문자열 끝에 추가합니다. (나머지가 0이면 패딩 불필요)
예시:
SGVsbG8(길이 7, 나머지 3) ->SGVsbG8=SGVsbG(길이 6, 나머지 2) ->SGVsbG==
5) 체크리스트
- 입력 문자열이 일반 Base64인지 Base64URL인지 구분했는가?
- JWT 세그먼트라면 패딩이 생략되었을 가능성을 고려했는가?
- 디코딩 실패 시 문자열 길이를 확인하고 4의 배수가 아니면 패딩을 복원해 보았는가?
Base64 인코딩/디코딩은 Base64 Encode/Decode 도구에서, JWT 토큰 분석은 JWT Decoder 도구에서 테스트해 볼 수 있습니다.