코딩마을방범대
Base64 인코딩이란? 본문
인코딩(encoding)
- 다른 형태로 변환하는 처리 방식을 말한다.
(정보의 형태나 형식을 데이터 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해) - 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다.
- 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 하는데, 이를 문자열 세트 또는 문자셋이라고 한다.
초기 문자열 세트는 아스키나 EBCDIC이 표준이었으나, 세계 곳곳에 인터넷이 보급되며 표현해야 할 문자가 증가하면서
이러한 문자셋을 표준화하기 위해 많은 대체 방식이 개발되었다. ( 현재 보편화된 유니코드가 대표적 )
ASCII는 더 이상 문자가 추가될 수 없지만, 유니코드는 문자가 계속 추가되는 중이다.
( 유니코드에서 한국어 발음을 나타날 때는 예일 로마자 표기법의 변형인 ISO/TR 11941을 사용하고 있다. )
Base64
8비트 이진 데이터를 문자 인코딩에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진
일련의 문자열로 바꾸는 인코딩 방법을 말한다.
Base64의 인코딩 과정
24bit의 buffer를 생성하여 위쪽(MSB)부터 바이트 데이터를 넣은 뒤,
버퍼의 위쪽부터 6bit 단위로 잘라 Base64 테이블의 ASCII 문자로 변환한다.
64개의 문자로 모든 문자열을 표현하고자 하면 6비트(64 = 2^6)가 필요하다.
하지만 일반적인 컴퓨터 데이터나 보편적으로 쓰이는 ASCII 문자는 모두 8비트(1byte)로 구성되어 있다.
Base64 인코딩을 위해선 문자열 2진 데이터를 6비트씩 묶어야하는데,
6과 8의 최소 공배수인 24비트씩 끊어서 묶도록 한 것이다.
원본 문자열 > ASCII binary > 6bit로 자르기 > base64 encoding
= 은 부족한 bit를 채워주는 padding 문자이다.
💡 MSB & LSB 란?
MSB : 최상위 비트
LSB : 최하위 비트
예시
Man 이란 글자를 인코딩하게 될 때 한 개의 Char은 8bit(1byte) 이므로 총 24bit의 크기를 가지고있다.
24bit를 6bit 단위로 자르게 될 경우 4개가 나오게 된다.
해당 비트를 기반으로 위의 표대로 문자를 출력한다.
M이란 글자만 인코딩을 시도할 경우 M은 총 8bit(1byte)의 크기를 가지고 있다.
하지만 Base64의 특성 상 24bit 단위로 buffer를 생성하기 때문에 총 16bit의 크기가 남는다.
위 상황을 배제하고 M이란 글자를 ASCII 바이너리 코드로 변환하였을 때,
8bit - 6bit = 2bit 가 남게된다.
이 나머지 2bit를 6bit로 채워주기 위해 0을 집어넣는다. ( 0을 넣어주어 나온 값은 Q이다. )
그럼 24bit 중 총 채워진 값은 12bit이다.
나머지 12bit는 위에서 말했던 padding 문자(=)를 넣어준다.
아래와 같은 결과를 얻을 수 있다.
위의 내용을 이해했다면 아래의 결과값 마지막에 왜 =가 들어가는지 이해할 수 있다!
Base64를 사용하는 이유
위의 과정대로 인코딩을 하게 되면, 6bit당 2bit의 오버헤드가 발생하여
전송해야될 데이터의 크기가 약 33% 정도 늘어난다.
이럼에도 불구하고 Base64를 사용하는 이유는 통신과정에서의 바이너리 데이터 손실을 막기 위해서이다.
ASCII 는 7bits Encoding인데 나머지 1bit를 처리하는 방식이 프로토콜, 시스템마다 다르게 해석되어 데이터가 왜곡될 여지가 있기 때문이다.
MIME(Multipurpose Internet Mail Extensions) 표준에서도 사용되는 인코딩 방법이며,
부수적으로 XML이나 HTTP 프로토콜에서도 특수문자 파싱 문제를 해결할 수 있는 수단 중 하나로 사용된다.
결론은!
Base64는 HTML 또는 Email과 같이 문자를 위한 Media에 Binary Data를 포함해야 될 필요가 있을 때
포함된 바이너리 데이터가 동일하게 전송 또는 저장되는걸 보장하기 위해 사용
참고사이트
[Base64] Base64이란 무엇일까? / Base64 사용 이유와 인코딩과 디코딩
'🎃 기타 > 상식 ❗' 카테고리의 다른 글
LDAP이란 (0) | 2023.08.29 |
---|---|
컨테이너와 Docker란? (0) | 2023.08.29 |
Intellij IDEA 유용한 단축키 모음 (0) | 2023.07.24 |
CertBot으로 SSL 인증서 발급받기 (0) | 2023.06.23 |
Load Balancing 이란? (0) | 2023.06.16 |