본문 바로가기

참고자료

인코딩은 무엇이며 BASE 64 인코딩이란 무엇일까?

  • 문자 인코딩이란 무엇일까?

인코딩을 영어로 쓰면 encoding 으로 쓴다. 즉, code화 하는것이다. 코드화 혹은 암호화라고 해도 된다.

암호화의 대상은 우리가 쓰는 문자들이다. 컴퓨터는 0과 1로 이루어진 이진데이터를 사용한다.

이진데이터 == 숫자로 이루어진 코드

그래서 컴퓨터가 사용할 수 있도록 우리들의 쓰는 문자를 이진데이터로 변형시킬 필요가 있다.

예를 들어 A 가 65라는 숫자라고 정의한 어떤 표준테이블이 있다고 가정할때, 다음과 같은 일이 일어난다.

반대로 문자 디코딩은 인코딩의 반대말이다. 0과 1로 이루어진 데이터를 우리가 실제 쓰는 말로 변형시키는 것이다.

 


  • 인코딩의 종류는 어떤것이 있을까?

이 글에서는 인코딩 6가지의 종류에 대해 다뤄보고자 한다.

1.아스키 인코딩

아스키 코드라고도 부르는 경우도 있다. 1963년도에 처음 발표된 첫 문자 코드이며 당시에는 그렇게 많은 문자를 표현 할 필요가 없어 알파벳과 몇몇 특수기호만 표현 할 수 있었다. 0~127의 범위의 128글자까지 코드로 표현 할 수 있었다.  

7비트로 표현하며, 나머지 1비트는 패리티 코드로 쓰도록 되어있다. 패리티 코드(= 패리티 비트)는 데이터 에러 검출을 위한 비트라고 생각하면 된다. 

아스키는 하나의 바이트에서 모든 문자를 처리하려고 하였다. 아스키코드를 설명할때 single -byte character set 혹은 single-byte encoding라는 문구를 볼 수 있는데, 여기서 말하는 하나(single)는 1바이트안에서 처리한다는 뜻이다.

영미권에서 제작한 소프트웨어를 한글 os에서 실행시켰을때 (나무위키 출처)

한편 비영어권에서는 자신이 사용하는 문자의 수가 이보다 많은데도 사용할 수 없었다. 만약 사용을 하려면 글자가 깨져버리게 되었다. 때문에 한 문자를 표현할 때 두 개 이상의 바이트를 사용하는 multe-byte-encoding을 시도하여 영어이외의 문자를 표현할 수 있는 국가코드를 개발하고자 하였다.


2.html 인코딩 

html 인코딩은 html 페이지를 올바르게 나타나게끔 하기 위한 인코딩이다. 개발을 하거나 html 파일을 볼 때 아래와 같은 태그를 본 적이 있을것이다.

 

<meta charset="UTF-8">

 

html 파일을 어떤 방식으로 인코딩하느냐를 설정하는 태그이다. html 파일도 결국 코드로 변환이 되어야 된다. 이때 인코딩 방식을 utf-8 이나 euc-kr 등으로 설정이 가능하다.

앞서 말한 아스키는 1byte를 표현할 수 있다. 하지만 표현해야할 문자(영어 이외)가 많아지면서 국가 언어를 인코딩하는 방식이 생겨났다. euc-kr 은 한글을 표현할 수 있는 국가 코드이다. 

하지만 특정 국가의 문자를 코드화 하는 방식이기 때문에 실행 환경과 다른언어를 사용할 때와 같이 경우에 따라 글자가 깨지는 경우가 발생했다. 이를 극복하기 위해 표준코드와 표준인코딩을 사용하고자 하였고, 환경에 상관없이 원하는 문자를 표현 할 수 있도록 3byte로 표현 가능한 utf-8과 같은 유니코드 인코딩 방식이 생겨났다.


3.유니코드 인코딩

유니코드란 숫자와 글자 가 1:1로 매핑된 형태의 코드이다. 아스키 코드 확장판이라고 생각하면 쉬울것 같다. 단, 아스키코드로 표현할 수 없는 문자들을 매핑을 시킨것이다. 여기에는 한글을 비롯한 많은 문자들이 포함된다. 이 유니코드를 통해 글자를 코드화 시키는 방식이 유니코드 인코딩 방식이며 앞서 말한 UTF-8도 이에 해당된다. 

가끔 다른 글에서 UTF-8의 특징으로 가변 인코딩 방식을 설명하는데, 쉽게 말해 유니코드에 있는 문자들의 바이트가 모두 같지는 않다는 뜻이다. 

UTF-8과 같은 유니코드를 사용하는 인코딩은 유니코드를 사용한 디코딩을 통해 디코딩을 해야한다. 유니코드에 맞지 않는 형식으로 디코딩을 시도한다면 데이터가 손실될 위험이 있기 때문이다.


4.URL 인코딩

아래의  url은 구글에 url 인코딩 이라는 키워드로 검색을 했을때의 url이다. 그런데 해당 url에는 키워드에 해당하는 단어가 없다.  그 이유는 url에서 쓰이는 문자는 아스키 코드이기 때문이다. 때문에 아스키코드가 아닌 문자들이 있을경우에는 16진수로 변환하여 컴퓨터가 읽을 수 있는 형태의 코드로 변환이 된다. 그래서 우리들이 주소창이나 검색창에 한글과 같은 문자를 쳤다 하더라도 실제로 해당 검색을 했을때는 url인코딩을 거쳐 변환된 문자로 서버에 요청이 가게된다. 그리고 서버에서 이런 요청을 받으면 인코딩된걸 다시 원본으로 변환하는 디코딩 작업을 한다. 형태는 문자를 옥텍트(octect = 8bit) 단위로 끊어 16진수로 표현하고 앞에 %를 붙인다.

https://www.google.com/search?q=url+%EC%9D%B8%EC%BD%94%EB%94%A9&sca_esv=566478814&hl=ko&sxsrf=AM9HkKnTjqncD2UX8tjU6wQE__xUJ2THOg%3A1695095540885

 

🔎 url 인코딩: Google 검색

 

www.google.com

5.hex(혹은 base16 인코딩)

16진수를 사용하는 인코딩이다. 문자열을 각각의 바이트를 두자리 16지법 숫자로  변환하고 이를 한번더 아스키 인코딩을 한다. 색상코드에 사용되거나 url 인코딩에서도 사용된다. 또 효율성은 떨어지지만 이진데이터를 일반 텍스트로 나타낼때 자주 사용한다고 한다. 인코딩은 기호의 수가 특정 비트에 맞춰지면 컴퓨터가 처리하기 더 쉬워진다. 16진수는 4bit로 표현 할 수 있는 값의 수인 16개의 기호를 가지고 있다. 

 

6.base64 인코딩

8비트 이진 데이터를 64진법으로 표현된 아스키 문자로 바꾸는 인코딩 방식이다. 아스키 문자로 변환하는 이유는 아스키코드는 거의 모든 컴퓨터와 통신 시스템에서 지원이 되기 때문이다. 즉, 시스템간 호환성을 보장할 수 있다. base64라는 이름은 64개의 서로 다른문자를 사용하여 이진 데이터를 표현하기 때문에 붙여졌다.

base64 는 6bit를 문자 크기의 단위로 사용한다. 컴퓨터 언어에서 기본적인 문자단위는 대부분 1바이트(8비트) 이므로 6과 8의 최소공배수인 24만큼의 bit씩 묶어서 처리한다. base64는 안전한 출력문자만 사용한다. 아스키코드로만 표현하면 문제가 일어날 수 있다. 8비트중 7비트는 문자처리에 사용되지만 나머지 1비트가 시스템별로 상이하기때문에 무슨일이 벌어질지 모르기 때문이다. base64 는 아스키중 제어문자와 일부 특수문자를 제외한 64개의 안전한 문자만 사용한다. 

 


  • base64 등장 배경

인터넷 초기에는 모든 커뮤니케이션이 텍스트 기반이었다. 당시에는 이메일이 주 통신수단이었기 때문에 데이터 전송은 SMTP(Simple Mail Transport Protocol) 기반이었다. SMTP는 모든 메세지를 7bit 아스키 코드로 표현하였다. 하지만 영상, 이미지 오디오와 같은 바이너리 데이터를 전송하기 위해서는 변환이 필요하였다. 바이너리 데이트는 8비트를 모두 사용하였기 때문이다.  그래도 8bit 데이터(Octect data)들을 7bit 아스키값으로 어거지로 표현하면 어떻게 보낼 수는 있었다. 8비트를 어거지 7비트로 바꾸는 초기 인코딩 방식이 UUEncode였다. (Unix to Unix Encode)

 

그리고 MIME이 등장하였다. MIME은 Mulitpurpose Internet Mail Extension 의 약자로 새로운 인터넷 표준이였다. MIME에서 확장된 기능으로 이메일 첨부로 멀티미디어 데이터를 주고 받을 수 있었다. MIME 은 BASE64 인코딩을 기본 인코딩 체계로 사용함으로써 8비트 아스키값을 안전하게 보낼 수 있게 되었다.

 

  • 어디에서 왜 쓰이나?

base64 인코딩을 사용함으로써 바이너리 데이터에 대한 안전한 전송을 할 수 있다.  html이나 email, 혹은 문자외의 데이터들은 base64 인코딩을 사용하여 시스템 환경에 관계없이 동일한 전송과 저장이 이루어 질 수 있다.

예를 들어 JSON과 같은 문자열 기반 데이터에 이미지 파일의 정보가 있어야 할 때 base64 인코딩을 통해 변환하면 UTF-8에서 쓸 수 있는 문자열을 얻을 수 있다. html에서 쓰이는것도 결국 문자열이기 때문이다. 

간단한 HTTP 인증에서도 쓰이거나 데이터를 cookies에 이동시킬때도 사용한다. 클라이언트와 서버간 http 프로토콜을 통해 리소스를 주고 받을때 문자열 형식이 가장 빠르고 효과적이다. HTTP를 통한 기본인증(Http Basic Authentication)을 사용시에도 환경에 제한이 적은 base64 인코딩을 사용한다. 하지만 인증과 같은 보안이 필요한 곳에서는 base64를 사용하지 않는것이 좋다. base64는 언제든지 디코딩이 가능하기 때문에 중요한 정보들을 해독할 수 있기 때문이다.

 

 

 

참고

인코딩 vs 디코딩 정확하게 이해하기:

https://codingpractices.tistory.com/entry/%EC%9D%B8%EC%BD%94%EB%94%A9-vs-%EB%94%94%EC%BD%94%EB%94%A9-%EC%A0%95%ED%99%95%ED%95%98%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

유니코드란 무엇일까?(UTF8과 EUC-KR비교):

https://norux.me/31

문자열 인코딩 완벽 정리하기(for 개발자)

https://redisle.tistory.com/14

base64 인코딩에 대해 설명하실 수 있나요?

https://medium.com/atant/base-64-%EC%9D%B8%EC%BD%94%EB%94%A9%EC%97%90-%EB%8C%80%ED%95%B4-%EC%84%A4%EB%AA%85%ED%95%98%EC%8B%A4-%EC%88%98-%EC%9E%88%EB%82%98%EC%9A%94-a67f204bb3b2

base64 이란 무엇일가? / base64 사용 이유와 인코딩과 디코딩

https://devuna.tistory.com/41

 

'참고자료' 카테고리의 다른 글

SOAP란 무엇일까? - 웹서비스와 SOAP  (1) 2023.10.11
MIME 이란? Content-type 이란?  (0) 2023.09.26
API와 SDK  (0) 2022.04.14
blocking 과 non blocking  (0) 2022.01.27
웹서버 nginx  (0) 2022.01.27