Base64 란


 8비트 이진 데이터를 64개의 문자를 이용하여  공통 아스키 문자로 표현하기 위해 만들어진 인코딩 방식이다. 

 

 Base64를 글자 그대로 직역하면 64진법이라는 뜻이다. 64진법은 컴퓨터한테 특별한데 그 이유는 64가 2의 제곱수 64=2^6이며 2의 제곱수에 기반한 진법 중 화면에 표시되는 ASCII 문자들로 표시할 수 있는 가장 큰 진법이기 때문이다. (ASCII에는 제어문자가 다수 포함되어 있기 때문에 화면에 표시되는 ASCII 문자는 128개가 되지 않는다.)


 구체적으로 A~Z, a~z, 0~9 까지의 62개 문자와 +,/의 2가지 기호가 사용되며 남은 부분은 = 기호로 채워진다. 


 인코딩시 약 33% 정도 데이터의 양이 늘어나는 특징이 있다.


Base64 동작 원리


  24비트 버퍼에 바이너리 데이터를 6비트씩 자르고 6비트를 10진수로 변환한 뒤, 해당 10진수에 대응하는 Base64 색인표에 값을 찾아 치환한다. 24 비트(3바이트)씩 가져오기 때문에 그보다 작은 값이 들어오면 = 으로 채워준다. 이것은 원본으로 되돌릴 때 원본에 없던 비트가 생겨나는 것을 방지하기 위함이다.





위 사진은 a라는 문자를 인코딩하는 예이다. 위 설명과 같이 남은 6비트 2개의 영역을 = (패딩) 처리 해주었다.



쓰이는 이유


 Base64 인코딩을 하게되면 데이터의 양이 약33% 늘어난다. 6비트당 2비트의 오버헤드가 발생하기 때문이다. 이렇게 데이터의 크기가 증가 하는데 왜 쓰일까

 문자를 전송하기 위해 설계된 이메일등에서  이미지나 오디오를 전송 할 필요가있을때, 아스키코드로 인코딩 하게되면 문제가 발생할 수있다. 

 1. 아스키는 7비트 인코딩인데 대부분 8비트로 만들어진 데이터 형태를 갖는다.

 2. 아스키 코드 안에는 화면에 표시되지 않는 제어문자가 포함 되어 있고일부 제어문자 (e.g. Line ending)의 경우 시스템 별로 다른 코드       값을 갖는다.


 위와 같은 문제로 아스키는 데이터 전달하는데에 위험성이 있다. Base64는 아스키중 제어문자를 제외한 64개의 안전한 출력 문자만 사용 하기 때문에 사용 되어 진다.


즉 이메일과 같이 문자를 위한 곳에 이진 데이터로 나타내어질 수 있는 파일을 시스템 독립적으로 동일하게 전송 하기위해 쓰인다 라고 정리 할 수 있을 것 같다. 


 이렇게 base64는 바이너리 데이터를 어느 문자셋에나 있는 아스키코드 기반 기본문자로 인코딩을 해준다. 이렇게 인코딩된 데이터를 받으면 디코딩만 해주면 온전하게 데이터를 받을 수 있는 것이다.


 가장 핵심은 아스키코드 기반 기본문자로만 표현이 되기 때문에 호환성이 좋다는 것 즉 데이터를 온전히 전송 가능하다는 점이다.

어느 시스템에서 어떤 시스템(문자셋) 으로 받던 인코딩 하고 디코딩 해서 받으면 깨짐없이 데이터가 전송 가능하다는 것!


쓰임새


 암호화된 원문을(바이너리파일) 저장,전송 할때 base64로 다시한번 인코딩 하고 쓰인다. 암호화된 파일도 어딘가에는 저장이 필요할 텐데 저장을 돕는 프로그램도 (db) 어느 문자셋을 기반으로 할 것이고 그럼 그곳에 바이너리 파일 그대로를 넣으면 데이터는 깨지게 될 것이다. 하지만 암호화된 파일(바이너리)을 다시한번 base64로 인코딩하면 식별가능한 아스키코드 기반 기본문자로 바뀌고 이것을 저장하면 문제가 생기지 않는다.


 예를 들어 사용자 비밀번호와 같은 데이터는 DB에 저장 될 때 원문 그대로가 아닌 암호화(단방향 암호화) 되어 저장 되어지는 것이 필요하다. 데이터 유출시 비밀번호 유출을 막기 위함이다. DBMS는 사람이 보고 인식하는 곳으로 지정된 문자셋이 있는데  이때 sql문으로 데이터를 넣을때 암호화된데이터(바이너리)를 그대로 넣으면 정해진 DBMS 문자셋 에 의해 암호화된데이터가 깨지게 된다. 그래서 암호화된데이터를 한번더 base64로 인코딩 해주고 DBMS에 넣으면 관리가 용이해진다.


 여담- 단방향 암호화= 원문을 암호화하는 알고리즘은있지만 이를 복호화하는 키가 없는 기법. 


사용자의 비밀번호를 단방향 암호화로 저장하고 (유출방지) 다시 사용자가 비밀번호를 입력할때 입력된 비밀번호를 암호화하고 초기에 설정된 암호화된 비밀번호랑 비교하는 방식으로 검증을 하면 된다.

  



참고 

http://effectivesquid.tistory.com/26

https://okky.kr/article/276104


'개념' 카테고리의 다른 글

[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
유니코드와 utf-8 utf-16  (3) 2018.06.26

+ Recent posts