Invalid base64-encoded string 오류

헨도·2024년 2월 1일
0

Python

목록 보기
12/12
post-thumbnail

오류

Firebase 서비스를 이용하여 로그인을 처리하는 과정 중 오류가 발생했다.

내가 하려는 서비스를 간단히 설명하자면...

  1. Firebase Oauth 로그인을 시도
  2. 넘어오는 idToken 을 가지고, payload 만 파싱
  3. 파싱한 payload 를 base64 decode 함수를 이용하여 데이터 추출
  4. 추출 데이터 DB 저장

위의 간단한 절차 중 3번을 처리하면서 만난 오류인데, 오류의 내용은 이러했다.

오류 내용

Invalid base64-encoded string: number of data characters (681) : number of data characters (1) cannot be 1 more than a multiple of 4

위의 내용을 검색해본 결과, 세션 데이터의 길이가 4배수여야 하는 데, 681로서 4의 배수보다 1이 큰 길이인 상황이어서 발생하는 오류였다.

필자는 오류를 해결하기 위해 4의 배수를 맞추기 위해, decode 소스 부분에 "=" * 3 식을 사용해 맞추어 보려했지만 로그인을 하면서 세션 데이터의 길이가 랜덤으로 바뀌는 현상이 있는지 해결이 되지 않았다..

decoded_pay = json.loads(base64.b64decode(pay).decode('UTF-8') # pay는 idToken의 payload 부분에 해당한다.

오류 해결

대리님께서 도와주신 덕에 해결 할 수 있었다.

데이터의 길이가 랜덤으로 바뀐다고 생각하여 데이터의 전체 길이를 4로 나눈 후 그 값을 4에서 뺀다.
그 후 뺀 값만큼 '=' 에 곱한다.

  • = 에 곱해서 데이터 추가하는 이유는 base64 에서 = 값은 의미없는 값이기 때문에 base64 4의 배수를 맞추기 위해 더해준다.

즉, 위의 내용을 식으로 작성하면

new_pay = pay + '=' * (4 - len(pay) % 4)

위의 식을 이용하여 데이터 길이를 4배수로 맞추어줄 수 있다.

해결 코드

new_pay = pay + '=' * (4 - len(pay) % 4)

decoded_pay = json.loads(base64.urlsafe_b64decode(bytes(pay, 'utf-8')))
profile
Junior Backend Developer

0개의 댓글