티스토리 뷰

Encoding

[Encoding]Base64

heyhyo 2018. 6. 25. 17:41

Base64란 8비트 이진 데이터를 문자 코드에 영향을 받지않는 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 뜻한다. (여기서 이진 데이터라는 것은 실행가능한 실행파일, 알집파일, 이미지파일 등의 0과1로 기록된 파일을 뜻한다.)


번역하면 64진법이라는 뜻이다. 64는 2의 6제곱으로 2의 제곱수들에 기반한 진법들 중에서 화면에 표시되는 ASCII 문자들을 써서 표현할 수 있는 가장 큰 진법이다.  인코딩된 문자열은 알파벳 대소문자, 숫자, '+', '/' 총 64개로 이루어지며, '='은 끝을 알리는 코드로 쓰인다. Base64에는 어떤 문자와 기호를 쓰느냐에 따라 여러종이 있지만, 잘 알려진 것은 모두 처음 62개는 A-Z, a-z, 0-9를 사용하고 있다는 것이다. 그리고 나머지 2개의 문자를 어떤 것으로 사용하느냐의 차이만 있다. Base64의 정확한 규격은 RFC 1421, RFC 2045에 정의된다. 표준은 아래와 같다.


* ASCII는 출력가능한 문자가 공백을 포함하여 95개, 나머지 33개는 출력이 불가능한 제어문자이기 때문에 Base128과 같은 인코딩 방식이 등장하지 않은 것이다.


* Base64 표현가능한 인코딩 문자


 Value

Encoding

 Value

Encoding

Value

Encoding

Value

Encoding

 0

 A

 17

 R 

 34 

 i 

 51 

 z 

 1

 B

 18

 S

 35

 j

 52

 0

 2

 C

 19

 T

 36

 k

 53

 1

 3

 D

 20

 U

 37

 l

 54

 2

 4

 E

 21

 V

 38

 m

 55

 3

 5

 F

 22

 W

 39

 n

 56

 4

 6

 G

 23

 X

 40

 o

 57

 5

 7

 H

 24

 Y

 41

 p

 58

 6

 8

 I

 25

 Z

 42

 q

 59

 7

 9

 J

 26

 a

 43

 r

 60

 8

 10

 K

 27

 b

 44

 s

 61

 9

 11

 L

 28

 c

 45

 t

 62

 +

 12

 M

 29

 d

 46

 u

 63

 /

 13

 N

 30

 e

 47

 v

 (pad)

 =

 14

 O

 31

 f

 48

 w

 

 

 15

 P

 32

 g

 49

 x

 

 

 16 Q 33 h 50 y  


* ASCII(American Standard Code for Information Interchange)란 미국정보교환표준부호라는 뜻으로 영문 알파벳을 사용하는 대표적인 문자 인코딩이다. 7비트 인코딩이며 33개의 출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 이루어진다.


* RFC(Request for Comments)란 비평을 기다리는 문서라는 의미로, 컴퓨터 네트워크 공학 등에서 인터넷 기술에 적용 가능한 새로운 연구, 혁신, 기법 등을 아우르는 메모를 나타낸다.




인코딩 방법





Base64는 연속된 8비트(1바이트) 단위로 인코딩한다. 그 과정은 아래와 같다.


1. 24비트(3바이트) 버퍼에 가중치가 높은 비트(MSB)부터 차례로 1바이트씩 3바이트를 집어넣는다. 여기서 남은 바이트가 3바이트 미만이라면 , 남은 부분은 0으로 채운다.


* 여기서 24비트씩 버퍼에 집어넣는 이유는 Base64 인코딩 방식은 6비트 단위로 수행되므로 1바이트는 8비트이므로 이 둘의 최소공배수는 24이다. 그래서 24비트씩 집어넣고 6비트씩 꺼내어 변환하기 위해 버퍼의 크기는 24비트를 사용하는 것이다.


2. 그리고 버퍼의 위쪽부터 6비트씩 읽어서 Base64의 인코딩 문자로 변환한다. 여기서 24비트 중 비어있는 6비트는 '='(pad)으로 변환하여 빈 공간이라는 것을 명시하여 원본으로 되돌릴 때 없었던 비트가 생겨나는 것을 방지한다.


3. 위의 1, 2번 과정을 반복하여 인코딩을 완료한다.


인코딩이 완료되면 원본 데이터의 크기의 4/3정도로 크기가 증가한다. 그럼에도 이 인코딩을 쓰는 이유는 이미 전자 메일의 프로토콜은 ASCII로 전송되는 것을 기본 전재로 하고 있기 때문이다. 따라서 ASCII 형태로 인코딩하는 Base64인코딩 방식을 사용하는 것이다.




왜 등장하였는가?



이 인코딩 방식은 전자 메일을 통한 이진 데이터 전송에 사용하기 위해서 등장했다. MIME은 전자 우편을 위한 인터넷 표준 포맷이다. SMTP프로토콜에서 전자우편은 7비트 ASCII 문자를 사용하여 전송되기 때문에, 8비트 이상의 코드를 사용하는 문자나 이진 파일들은 MIME 포멧으로 변환되어 SMTP(Simple Mail Transfer Protocol)로 전송된다. 여기서 MIME은 파일의 포멧을 뜻하며, SMTP는 이 파일을 주고받는 프로토콜을 의미한다. SMTP는 7비트 ASCII문자만을 지원하므로 ASCII문자로 표현할 수 없는 영어 이외의 언어로 쓰인 전자 우편은 제대로 전송될 수 없다. 따라서 영어가 아닌 다른 언어로 된 전자 우편과 그림, 음악, 영화, 프로그램과 같은 8비트 이진 파일 또한 보낼 필요성을 느끼게 된다. 따라서 SMTP로 전송하기 위해서 모든 파일을 아스키코드의 형태로 변경하게 되어 Base64 인코딩이 사용되게 된다.


그렇다면 SMTP방식을 사용하지 않으면 되지 않겠느냐고 반문할 수 있겠지만, 사람들은 익숙한 것을 선호하고, 미국에서 처음 발명된 컴퓨터는 미국이 만들어 놓은 룰에 의해서 인프라가 만들어졌다. 이미 만들어진 인프라를 변경하기란 쉽지 않다. 그래서 이와같이 MIME으로 변경하여 전송하고 다시 원래의 데이터로 바꾸는 형식을 사용하는 것이다.


* MIME(Multipurpose Internet Mail Extensions)은 전자 우편을 위한 인터넷 표준 포멧이다. 7비트 ASCII형식으로 전송되는 전자우편의 경우 8비트 이상의 코드를 사용하는 문자나 이진파일들이 7비트 ASCII로 변환될 필요가 있다. 따라서 이들을 Base64인코딩을 통하여 ASCII형태로 변경하는 포멧이다.


* SMTP(Simple Mail Transfer Protocol)은 간이 전자 우편 전송 프로토콜을 뜻한다. 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다. 이 프로토콜이 주고 받는 데이터의 형태는 텍스트 기반으로 모든 문자가 7비트 ASCII로 되어있어야 한다. 따라서 8비트 이상의 코드를 사용하는 언어나 각종 바이너리 파일들은 MIME이라는 포멧으로 7비트로 변환되어 전달된다.




Base64는 암호화 기법?



Base64는 단언컨데 절대 보안을 용도로 사용하지는 않는다. 인코딩 디코딩과정을 거친다고 해서 그것을 암호라고 단정지을 수 없다. Base64는 이미 전세계적으로 널리 알려져있는 인코딩 형식인데 이것을 보안이 필요한 곳에 사용하는 사람은 없을 것이다. 단지 Base64의 용도는 바이너리 파일들을 아스키코드로 표현할 수 있는 문자로 변환하는 것이 주 목적이지 절대로 이 인코딩 형식을 보안이 필요한 곳에 사용하지는 않아아 한다.




Base64의 활용용도





Base64인코딩을 거친 모든 파일들은 ASCII의 일부 문자로 변형된다. 의미는 없지만 최소한 사람이 알아볼 수 있는 영어와 숫자의 연속적인 형태로 보인다는 것이다. 암호화를 거친 데이터는 바이너리 데이터로 변형된다. 하지만 우리가 바이너리 데이터를 알아보는 것은 너무 어려운 일이다. 따라서 프로그래머들은 바이너리 데이터를 좀 더 보기쉬운 형태로 다루기를 원한다. 그럴때 Base64인코딩을 거치면 그 바이너리 파일들이 일련의 규칙으로 ASCII로 변형되어 관리하기에 더 편한 형태로 바뀌게 된다.


위 그림을 예로 들어서 우리가 데이터베이스에 사용자의 패스워드를 저장하는 상황을 가정해보자. 그럼 사용자의 패스워드는 반드시 암호화를 거쳐서 데이터베이스에 저장될 것이다.(sha1 단방향 암호화방식) 암호화의 결과로 바이너리 데이터가 되고, 바이너리 데이터를 그 자체로 저장하게 되면 그 데이터는 알 수 없는 한자나 읽을 수 없는 한글의 형태로 저장될 수도 있다. 이런 바이너리 데이터를 데이터베이스에서 처리하기에는 힘들 수 있다. 하지만 이 바이너리 데이터를 아스키 형태의 값으로 변형한다면 이 값은 일련의 영어와 숫자의 조합이 되기때문에 관리 측면에서도 더 편리할 수 있다.




인코딩의 목적과 SPEC



인코딩의 최종 목표는 인간이 읽을 수 있는 형태로 보여질 수 있도록 데이터를 정제하는 것이라고 생각한다. 우리가 흔히 알고있는 jpg 이미지 파일을 메모장에서 열어보면 알 수 없는 형태로 보여진다. 이것은 jpg 파일을 메모장에서 정확히 디코딩 하지 못했기 때문에 일어나는 일이다. 메모장에서는 ANSI, Unicode, UTF-8형식만 지원하므로, jpg파일을 어떻게 읽어야할지 모르기 때문에 파일이 이상하게 나타나는 것이다. 따라서 우리가 뒤에 확장자를 붙이는 이유는 '이 파일은 jpg형식으로 저장되어있으니 jpg SPEC에 명시된 방식으로 데이터를 해석하시면 됩니다.'라는 뜻으로 해석할 수 있다. 여기서 SPEC이라는 것은 해당 파일이 어디부터 어디까지의 데이터가 무슨 역할을 하고 실제 데이터는 어디부터 어디까지인지를 정확하게 표시한 설명서라고 생각하면 될 것 같다. 결국 인코딩과 디코딩은 파일을 기계가 알아보기 쉽게 저장하여 그 저장된 파일을 사람이 알아보기 쉽게 꺼내서 보여주는 것이 최고 목표인 것이다.




참고



https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464

https://okky.kr/article/276104

http://bbolmin.tistory.com/46

'Encoding' 카테고리의 다른 글

[Encoding]유니코드(Unicode)  (1) 2018.06.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함