RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
Dev  2010. 11. 28. 23:21
 우연히 Base 64 Encoding이 무엇이냐? 라는 질문을 받았다. 물론 알리가 없다. 그래서 인터넷을 기웃기웃 거렸다. 그리고 정리를 해보려고 한다. 아래 내용은 정확한 내용이 아닌 인터넷에서 돌아다니는 내용들을 제 나름대로 정리한 것이므로 틀린 부분이 존재할 수 있습니다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다.

 일반적으로 컴퓨터 내에서는 Binary Stream을 전송하는 데는 문제가 없다. 하지만 인터넷 상에서는 문제가 생긴다. 인터넷 상에서는 기본적으로 1Byte(8bits)를 기본단위로 전송하기 때문이다.

 왜 문제인가?

 첫번째, 일반적으로 우리가 0xDE(1101 1110) 라는 코드를 전송한다면 컴퓨터 내에서는 8bits만 전송하면 된다. 하지만 인터넷상에서는 'D'와 'E'라는 2개의 문자를 전송해야 하므로 문자 당 8bit가 필요하므로 총 16 bits가 필요하다. 이것은 실제 데이터를 보내기 위해서 2배의 데이터를 보내야 하므로 굉장히 비 효율적이게 된다. 따라서 이것을 좀더 효과적으로 만들기 위한 방법이 필요했다.

 두번째, 초기 컴퓨터의 표준은 아스키코드(ASCII)라고 할 수 있고, 아스키 코드를 표준으로 사용했다. 하지만 지금은 많은 다른 코드들을 이용한데 대표적으로 한글을 이용하기 위한 유니코드(Unicode)가 있을 수 있다. 이 때 유니코드를 인식할 수 없는 컴퓨터가 존재할 수 있다는 것이다. 이 때 유니코드를 유니코드를 인식할 수 없는 컴퓨터에 전송하면 문제가 발생 할 수 있는 것이다. 예를 들면 한글(유니코드)을 한글을 지원하지 않는 컴퓨터(아스키만 지원)에서 보았을 때 이상한 문자로 보이는 것이 한 문제일 수 있다. 이러경우에는 프로그래머가 데이터를 처리하기 어려우므로 데이터 전송 시 대부분의 컴퓨터에서 처리 가능한 문자로 전송하는 방법이 필요하게 된 것이다.

이 문제들에 대한 해결책이 Base 64 Encoding이다.

Base 64 Encoding 은 모두 64개의 문자로 구성되어있다. 그래서 64라는 숫자를 사용하는 것이다.
컴퓨터는 2진수를 사용하므로 2진수로 64개의 문자를 나타내려면 총 6bit가 필요하다. 2^6 = 64
따라서 Base 64 Encoding는 모든 문자를 6 bi t로 표현하다.

 사용되는 문자는 A~Z,a~z,0~9,+,/ 로 총 26 + 26 + 10 + 2 = 64개 이다. 여기에 padding을 위해서 '='를 사용한다. 따라서 실직적으로 Base 64 Encoding 에서 사용되는 문자는 총 65개이다.

6 bit로 표현되는 Index : index에 해당하는 문자
 
000000 : A 001010 : K 010100 : U 011110 : e 101000 : o 110010 : y 111100 : 8
000001 : B 001011 : L 010101 : V 011111 : f 101001 : p 110011 : z 111101 : 9
000010 : C 001100 : M 010110 : W 100000 : g 101010 : q 110100 : 0 111110 : +
000011 : D 001101 : N 010111 : X 100001 : h 101011 : r 110101 : 1 111111 : /
000100 : E 001110 : O 011000 : Y 100010 : i 101100 : s 110110 : 2
000101 : F 001111 : P 011001 : Z 100011 : j 101101 : t 110111 : 3 Pad    : =
000110 : G 010000 : Q 011010 : a 100100 : k 101110 : u 111000 : 4
000111 : H 010001 : R 011011 : b 100101 : l 101111 : v 111001 : 5
001000 : I 010010 : S 011100 : c 100110 : m 110000 : w 111010 : 6
001001 : J 010011 : T 011101 : d 100111 : n 110001 : x 111011 : 7

 그렇다면 이제는 어떻게 모든 문자들을 6bit로 나타내는지 알아볼 차례이다. 일반적으로 한 문자를 나타내는 기본단위는 8bit이다. 우리는 8bit 데이터들를 6bit의 데이터들로 바꾸어 주어야 한다. 이를 위해서 먼저 8과 6의 최소공배수인 24를 구한다.
 여기에서 우리가 얻는 아이디어는 3개의 8bit 데이터(3x8=24)를 4개의 6bit 데이터(4x6)로 바꿀 수 있다는 것이다.

 

base64encoding출처 : A golfer's Dream http://par.sarang.net/369


 위의 그림은 Base 64 Encoding / Decoding 을 나타낸 것이다. 윗 부분이 8bit 3개로 이루어진 데이터이고 아래가 6bit 4개로 이루어진 것이다. 8bit로 이루어진 데이터들을 6bit로 이루어진 데이터로 변환 하는 경우에는 3가지가 있다.

 1. 원본데이터의 글자 수가 3배수 인 경우     (예 : ABCDEF, 6 % 3 = 0)
 2. 원본데이터의 글자 수가 3배수 + 1인 경우 (예 : ABCDEFG, 7 % 3 = 1)
 3. 원본데이터의 글자 수가 3배수 + 2인 경우 (예 : ABCDEFGH, 8 % 3 = 2)

 2,3 의 경우같이 떨어지지 않은 경우는 모자라는 bit를 0으로 채워서 문자를 만들거나 Padding('=')문자가 된다. 'car'를 Base 64로 인코딩해 봅시다.


1. 원본데이터의 글자 수가 3배수 인 경우 : 'car'

Character         c                  a                  r
ASCII               99                 97                114
Binary              0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0
                       0 1 1 0 0 0 
                                      1 1 0 1 1 0
                                                     0 0 0 1 0 1
                                                                   1 1 0 0 1 0
Index               24             54           5             50
Base64             Y              2            F             y  

24bit 데이터를 6bit씩 4개로 분리하여 Base 64로 변환합니다. [Y2Fy]



2. 원본데이터의 글자 수가 3배수 + 1인 경우 : 'c'

Character         c                  
ASCII               99                
Binary              0 1 1 0 0 0 1 1
                       0 1 1 0 0 0 
                                      1 1 0 0 0 0 (부족한 4bit 0으로 채움)
                                                     = = = = = =  (데이터가 없는 부분은 padding으로 처리)
                                                                    = = = = = =
Index               24             48
Base64             Y               w            =             =   

w 값을 계산할 때 뒤쪽 4bit의 값이 존재하지 않는데, 이곳은 0으로 채워주고 문자를 만들어 줍니다.
그 뒤에 존재하지 않는 데이터에 대해서는 Padding(=)으로 처리해 줍니다.
따라서 'c'는 Base64에서 [Yw==]로 변환됩니다.

 디코딩(Decoding)하는 과정에서 뒤에 Padding(=)이 2개 있는 것을 확인하면 입력된 base64의 값들은 ASCII에서 하나의 문자를 표현한다는 것을 알 수 있습니다.


24bit 데이터를 6bit씩 4개로 분리하여 Base 64로 변환합니다. [Y2Fy]



3. 원본데이터의 글자 수가 3배수 + 2인 경우 : 'ca'

Character         c                  a
ASCII               99                 97
Binary              0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 1 
                       0 1 1 0 0 0 
                                      1 1 0 1 1 0
                                                     0 0 0 1 0 0 (부족한 2bit 0으로 채움)
                                                                     = = = = = = (데이터가 없는 부분은 padding으로 처리)
Index               24             54           4              
Base64             Y              2            D              =

 D 값을 계산할 때 뒤쪽 2bit의 값이 존재하지 않는데, 이곳은 0으로 채워주고 문자를 만들어 줍니다.
그 뒤에 존재하지 않는 데이터에 대해서는 Padding(=)으로 처리해 줍니다.
따라서 'ca'는 Base64에서 [YwD=]로 변환됩니다.

 디코딩(Decoding)하는 과정에서 뒤에 Padding(=)이 1개 있는 것을 확인하면 입력된 base64의 값들은 ASCII에서 두개의 문자를 표현한다는 것을 알 수 있습니다.

 
 이제까지 간단하게 Base 64 의 Encoding에 대해서 알아보았습니다. Decoding은 정확히 이의 역 과정입니다. 만들어 보려했지만 일이 많아지는군요.  다시 한 번 Base 64의 장점 2가지를 적고 마무리 하자면, 
 
1. 모든 데이터를 우리눈으로 볼 수 있는 데이터로 만들 수 있다. 심지어 빈칸 및 특수목적을 위한 값들도 문자로 표시된다. 

2. 전송을 효율적으로 할 수 있다. '0xFF' 바이너리 데이터를 문자로 표시해서 보내기 위해서는 'FF'문자를 보냄으로서 원본에 비해서 2배의 데이터를 전송한다. 하지만 Base64에서는 'car'를 'Y2Fy'로 전송하므로써 원본에 비해서1.33배의 데이터를 전송함으로써 기존 방법보다는 효율적인 전송이 가능하다.

  또한 Base64를 URL을 위해서 변환한 것도 있고 Base16, Base32도 있다는데 이것은 잘 모르겠네요. 그냥 넘어갑니다.

  아래 링크를 가시면 입력값들을 Base64값으로 변환된 값을 확인해 볼 수 있습니다.



참고 사이트

1. http://par.sarang.net/369
2. http://kimsumin75.blog.me/20056272734
3. http://blog.naver.com/cipher2002?Redirect=Log&logNo=120094637990


'Dev' 카테고리의 다른 글

Html Decoder  (0) 2014.04.03
Html Encoder  (0) 2014.04.03

Trackback
Reply
Moss:
Root (119)
Dev (14)
Life (29)
Programming (2)
Music (2)
Android (4)
Tip (2)
Java (11)
Creative (3)
Lyrics (2)
Windows 7 (2)
Etc (7)
C# (8)
Spring (1)
jQuery (2)
Web (4)
Travel (10)
Cook (0)
«   2024/05   »
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