본문 바로가기
쿤즈 Dev/용어사전

Base64 와 Base64 Url Safe 의 차이점

by :)Koon 2020. 12. 15.

컴퓨터 분야에서 프로그래밍, 특히 웹 프로그래밍을 할때에는 Base64라는 것을 주로 많이 사용하게 됩니다. 문자들을 Base64(베이스64) 형태로 변환해서 전송하고 받은 쪽은 다시 변환해서 사용하는 방법을 말합니다.

 

 

이번 포스팅에서는 Base64에 대해서 알아보고 변화하는 원리와 방법, 그리고 Base64와 Base64 url safe의 차이점에 대해서도 알아보도록 하겠습니다.


Base64(베이스64)

Base64는 컴퓨터 분야에서 사용하는 이진(8bit) 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로 바꾸는 인코딩 방식을 말합니다. 여기서 64라는 말은 64진법을 의미합니다. 즉 64개의 문자들을 반복적으로 사용하겠다는 의미입니다.

 

Base64에서 사용하는 문자들은 다음과 같습니다.

문자 문자 문자 문자 문자
0 A 13 N 26 a 39 n 52 0
1 B 14 O 27 b 40 o 53 1
2 C 15 P 28 c 41 p 54 2
3 D 16 Q 29 d 42 q 55 3
4 E 17 R 30 e 43 r 56 4
5 F 18 S 31 f 44 s 57 5
6 G 19 T 32 g 45 t 58 6
7 H 20 U 33 h 46 u 59 7
8 I 21 V 34 i 47 v 60 8
9 J 22 W 35 j 48 w 61 9
10 K 23 X 36 k 49 x 62 +
11 L 24 Y 37 l 50 y 63 /
12 M 25 Z 38 m 51 z    

영어 대문자 A-Z, 소문자 a-z, 숫자 0-9, 기코 +, /, 이렇게 총 64글자를 이용해서 문자를 표현합니다. 이 문자들을 이용해서 웹으로 주고받을때의 문자들을 변환(인코딩)합니다.


Base64(베이트64) 인코딩 하는 방법

Base64 인코딩은 위에서 언급했듯 ASCII 코드가 필요합니다. 아스키코드표는 위키백과의 주소를 첨부합니다.

아스키코드표 : https://ko.wikipedia.org/wiki/ASCII

이 아스키코드표를 이용해서 문자열을 수정해보겠습니다. 먼저 인코딩 하기 전 문자열이 Man 이라는 글자를 예로 들어보겠습니다. Man은 ASCII 코드표를 이용해서 십진수로 보면 77, 97, 110 입니다. 우리는 bit 가 필요하기 때문에 아래와 같이 bit 변환을 할 수 있습니다.

ⓒ 위키백과 https://ko.wikipedia.org/wiki/베이스64

이렇게 변한 bit를 이용해서 6bit씩 자르면 010011, 010110, 000101, 101110 이 되고 이는 십진수로 각각 19, 22, 5, 46이 됩니다. 여기서 변환한 십진수는 Index 값이 됩니다. 즉, 19번째, 22번째, 5번째, 46번째 글자라는 의미입니다.  위에서 Base64 코드표에서 각 인덱스 값을 찾으면 TWFu 가 되는 것입니다.


Base64(베이스64) 디코딩

디코딩은 인코딩의 반대입니다. 위에서 예로 든 TWFu라는 값이 전달되면 Base64 디코딩을 해서 Man 값을 얻어냅니다. 디코딩 순서는 먼저 각 문자들을 2진수로 변환하고 다시 8bit 씩 끊어서 ASCII 값으로 바꿔주면 됩니다.

다음 값이 전달되었다고 가정하겠습니다.

QmFzZTY0VGVzdA==

Base64 코드표를 이용해서 바꿔보면 다음과 같습니다.

16, 38, 5, 51, 25, 19, 24, 52, 21, 6, 21, 51, 29, 0 

여기서 == 글자가 있지만 이 글자는 문자의 종료를 의미하는 글자입니다. 6bit씩 자르다보니 남는 bit가 발생하기 때문에 채워넣은 pad 입니다. 이제 모두 2진수로 변환하면 다음과 같습니다.

010000 100110 000101 110011 011001 010011 011000 110100 010101 000110 010101 110011 011101 000000

이제 이 숫자들을 8bit씩 다시 묶어보겠습니다. 이때 == 2개가 있습니다. 이는 2bit 씩 2개를 pad 해주었다는 의미입니다. 자리를 맞추기 위해서 총 4bit를 넣어주었으므로 제거해주도록 하겠습니다.

01000010 01100001 01110011 01100101 00110110 00110100 01010100 01100101 01110011 01110100 [0000]

변환한 2진수들을 모드 십진수로 변경해 보도록 하겠습니다.

66 97 115 101 54 52 84 101 115 116 => B a s e 6 4 T e s t 

그리고 십진수값을 ASCII 코드표를 이용해서 문자로 바꿔보면 Base64Test 라는 결과가 나타납니다.


Base64 Url Safe

웹으로 전송하기 위해서 사용하는 문자가 Base64 형태의 문자입니다. 하지만 이 문자들을 사용하다보니 문제가 발생했습니다. 이유는 마지막 62, 63번 글자가 +, / 이기 때문입니다. 이 문자들을 전송하게 되면 정상적으로 전송되지 않는 문제가 발생합니다. 따라서 이러한 원문의 오류를 막기 위해서 등장한것이 safe 입니다.

 

이는 62, 63번 글자를 -(minus), _(underline) 으로 변경한 것입니다. 따라서 코드표는 다음과 같습니다.

문자 문자 문자 문자 문자
0 A 13 N 26 a 39 n 52 0
1 B 14 O 27 b 40 o 53 1
2 C 15 P 28 c 41 p 54 2
3 D 16 Q 29 d 42 q 55 3
4 E 17 R 30 e 43 r 56 4
5 F 18 S 31 f 44 s 57 5
6 G 19 T 32 g 45 t 58 6
7 H 20 U 33 h 46 u 59 7
8 I 21 V 34 i 47 v 60 8
9 J 22 W 35 j 48 w 61 9
10 K 23 X 36 k 49 x 62 - (minus)
11 L 24 Y 37 l 50 y 63 _
(under line)
12 M 25 Z 38 m 51 z    

이번 포스팅에서는 Base64(베이스64) 문자들을 이용해서 변환하는 방법을 알아보았습니다. 웹상에서는 이 Base64 형태의문자들을 많이 사용하고 있기 때문에 알아두시면 유용한 정보가 될것 같습니다.

댓글