JWT는 Header, Payload를
Base64
방식으로 인코딩을 하기 때문에 외부에서 쉽게 디코딩 할 수 있다.
따라서 외부에서 열람해도 되는 정보를 담아야 한다.
위의 내용을 보고 대체 Base64
가 무엇인지 궁금해서 한번 찾아보았다.
base64는 이진데이터를 텍스트로바꾸는 Encoding인데, ASCII영역의 문자로 이루어진 문자열로만 바꾸는 특징이 있음.
(64진법을 base로 함. 이진데이터를 기반으로할때 2^6이면 64인데 실제로 61이 숫자 9라서 영대소문자, 숫자를 모두 표현 가능)
만약, 6비트씩 이진데이터를 분할했을 때, 데이터가 완전한 6비트가 아니라면 남는 비트 뒤에 0을 채운다.
이후 빈 공간이 있었음을 알리기 위해 Padding문자 =
를 붙여준다.
ASCII는 8비트 단위로 문자를 표현하는데, Base64의 경우 6비트를 단위로 하기 때문에 데이터의 양이 늘어난다.
쉽게말하면 크기 8의 상자에 8개의 계란을 넣어서 택배를 보내던 것을
크기 8의 상자에 6개의 계란을 넣어서 택배를 보내는 것이다.
따라서 33%정도 데이터가 더 많아진다.
33% 정도 전송 데이터가 더 많아지는데 왜 Base64를 쓰는걸까?
ASCII는 8비트인데 사실상 7비트 인코딩을 하고, 1비트는 에러검출을 하는데 이용한다. 이 때 시스템 별로 에러 검출 방식이 상이하다.
그리고 줄바꿈의 경우
Unix, Linux는 Line Feed("\n") [아스키코드로 10]
윈도우는 Line Feed와 Carriage Return("\r") [아스키코드로 13]을 이용해서 시스템별로 상이함.
즉, ASCII는 시스템간 데이터를 전달하기에 안전하지 않은 수단이다.
문자 코드에 영향을 받지 않는 공통 ASCII테이블을 이용하는 Base64를 이용하면 안전할 것이다.
정리
Base64는 HTML 또는 Email과 같이 문자를 위한 Media에 Binary Data가 포함될 때, Binary Data가 시스템에 관계 없이 동일하게 전송, 저장되는 것을 보장하기 위해 사용한다.
참고:
Base64 인코딩이란?