BASE64란?

최권민·2023년 7월 9일
0

CS스터디

목록 보기
6/8

  • 프로젝트를 진행하며 JWT 토큰의 Key를 생성하거나, 단어를 그대로 보내지 않기 위해 Base64로 인코딩하여 보낸 적이 있다.
  • 대부분의 언어에서 Base64로의 인코딩/디코딩을 지원하는 만큼, BASE64가 어떠한 방식으로 동작하는 지를 확인하고자 한다.

Base64 인코딩이란?

  • Base64란 64진법을 의미하는데, 여기서 64는 2⁶으로, ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법을 의미한다.
  • 대부분 알파벳 A-Z, a-z, 0-9를 사용하며 나머지 두 개에 어떤 기호를 쓰느냐에 따라 여러 변종이 존재한다. 기본은 +와 /를 사용한다.
  • 이렇게 변환할 경우, 다른 문자 코드에 영향을 받지 않는 ASCII 형태로 변환할 수 있기 때문에 실행 파일이나 ZIP 파일 등을 전송하기에 안전해진다.
  • 위에 패딩으로 '='를 따로 빼놨는데, 부족한 비트를 '='로 채워 나중에 디코딩 하기 편하게 만들어 준다. 이외에도, 마침표의 역할로도 쓰인다.

예시로, 'Man'을 BASE64로 인코딩 하는 과정은 다음과 같다.

  • 즉 8자리의 Bit pattern을 6자리씩 끊어 새로운 문자열로 치환하는 방식이다.
  • 이러한 방식이기 때문에, 길이가 원래보다 33% 더 길어지게 된다.

Java에서의 Base64

  • Java에서는 java.util.Base64 유틸리티 클래스를 통해 기본적으로 Base64를 사용할 수 있다.
String originalText = "Test Text";
String encodedText = Base64.getEncoder().encodeToString(originalText.getBytes());

이렇게 간단하게 Base64로의 인코딩이 가능하며

byte[] decodedBytes = Base64.getDecoder().decode(encodedText);
String decodedText = new String(decodedBytes);

로 디코딩할 수 있다.

Python에서의 Base64

  • Python에서는 base64를 import 하여 Base64를 사용할 수 있다.
import base64

testText = "Python test"
testBytes = testText.encode('utf-8')

encodedBytes = base64.b64encode(testBytes)
encodedText = encodedBytes.decode('ascii')

위 과정을 통해 인코딩이 가능하며,

original_bytes = encodedText.encode('ascii')

decoded_bytes = base64.b64decode(original_bytes)
decoded_text = decoded_bytes.decode('UTF-8')

역순을 통해 디코딩 할 수 있다.

JavaScript에서의 Base64

  • JavaScript에서는 별다른 import 없이 내장함수를 통해 바로 변환이 가능하다.
const original_text = "JavaScript Test";
const encoded_text = btoa(original_text);

btoa(binary to ascii)를 통해 즉시 변환이 가능하며

const decoded_text = atob(encoded_text);

반대로 atob를 사용하여 디코딩 할 수 있다.


참고자료

https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464#cite_ref-2
https://sisiblog.tistory.com/255
https://hbase.tistory.com/399
https://dejavuhyo.github.io/posts/java-base64-encode-and-decode/

profile
하나의 궤적을 따라서

0개의 댓글