본문 바로가기
IT/문자인코딩

인코딩(Encoding)/디코딩(Decoding), MIME, Base64, 쉽게 이해하기

by 바닐라이코노미 2024. 5. 31.
반응형

프로그래밍 개발을 하거나 IT적으로 대화를 할 때 많이 들어봤지만 헷갈리던

문자인코딩 관련 용어들을 추가로 정리해보려 합니다

 

1. 인코딩/디코딩 이란

인코딩과 디코딩은 데이터를 정확하게 전송, 저장, 해석하기 위해 필요한 부분으로,

잘못된 인코딩 방식을 사용하면 데이터가 올바르게 표현되지 않거나, 전혀 다른 데이터로 해석될 수 있다

예를 들어, 한글 텍스트를 ASCII로 인코딩하려고 하면, 그 텍스트는 제대로 표현될 수 없다

* ASCII는 알파벳 중심으로 만들어진 문자셋(Character Set) 이므로

따라서 데이터를 처리할 때는 항상 올바른 인코딩 방식을 사용해야 하며, 데이터를 해석할 때는 해당 데이터가 어떤 인코딩 방식으로 인코딩 되었는지 알아야 올바르게 디코딩할 수 있다

 

- 인코딩

인코딩이란 문자나 기호들을 컴퓨터에서 저장하거나 전송할 수 있도록 숫자로 변환하는 방식이다

컴퓨터는 0과 1, 즉 이진수만을 이해할 수 있기 때문에, 우리가 사용하는 다양한 문자들을 컴퓨터가 이해할 수 있도록 변환해주어야 한다

예를 들어, 'A'라는 문자는 ASCII 인코딩에서는 '65'라는 숫자로 맵핑되어 있고 이를 컴퓨터가 이해할 수 있는 바이트로

변경하면 '01000001'이 된다 이런 변환 과정이 인코딩이라 할 수 있다

 

- 디코딩

디코딩은 인코딩의 반대 과정으로, 컴퓨터에 저장되어 있는 숫자 데이터를 다시 사람이 이해할 수 있는 문자로 변환하는 과정이다 위에 인코딩한 것을 거꾸로 '01000001' -> '65' -> 'A' 이렇게 된다고 볼 수 있다

 

- 문자 셋 (Character Set) = 코드표

바이너리 데이터로 변환하는 인코딩과 다시 문자로 변환하는 디코딩은 미리 정해진 규칙에 의해서 수행된다

이렇게 미리 정해진 규칙을 문자 셋이라고 한다 (ASCII표 와 같은)

그러나 인터넷이 전세계적으로 보급되며 표현해야 할 문자가 증가하면서 문자 셋들을 표준화할 필요성이 대두되었고,

이후 등장하게 된 것이 유니코드이다

 

- 문자 인코딩과 문자 셋

  *문자 인코딩 : 문자를 컴퓨터가 이해할 수 있는 신호로 만드는 것

  문자 셋(Character Set) : 인코딩과 디코딩을 위해 미리 정해진 규칙

문자 인코딩이란, 컴퓨터가 이해할 수 있는 바이너리로 어떤 방법을 사용해도 상관없는 방법론이고

문자 셋이란, 문자를 숫자로 매핑해 주는 표이다

 

2. MIME란

MIME(Multipurpose Internet Mail Extensions)는 인터넷 메일을 위해 다양한 종류의 데이터(텍스트, 이미지, 오디오, 비디오 등)를 전송할 수 있도록 확장한 표준이다

처음에는 이메일이 오직 ASCII 텍스트만을 지원했기 때문에, 다른 형태의 데이터를 보내기 어려웠는데, MIME는 이러한 제한을 극복하고, 이메일을 통해 다양한 형태의 데이터를 안전하게 보낼 수 있도록 해주었다

 

3. Base64 란

Base64는 데이터 인코딩 방식 중 하나로, 바이너리 데이터(예: 이미지, 오디오 파일 등)를 텍스트 형식으로 변환하는 데 주로 사용된다 이 방식은 바이너리 데이터를 64개의 인쇄 가능한 ASCII 문자로 변환하여 인터넷상에서 데이터를 쉽게 전송할 수 있게 해 준다

여기서 궁금한 점은 why? 바이너리 데이터(예: 이미지, 오디오 파일 등)를 Base64라는 과정을 거치게 되는지이다

 

데이터를 전송하는 표준이 ASCII코드인데 ASCII코드는 0~127까지로 7bit를 가지고 알파벳을 포함한 표준의 문자와 기호들을 표현할 수 있었고, 모두 시작이 0으로 시작한다는 공통점이 있었다

※ 8bit 형태로 데이터가 전송이 안된다는 말이 아니고 8bit로 표현되었을 때 ASCII 코드는 0으로 시작한다는 의미

 

하지만, 문제는 바이너리 데이터들은 8bit를 모두 사용하므로 첫 번째 숫자가 1로 시작하는 데이터들이 섞여 있다면 ASCII코드로는 바이너리 데이터를 제대로 처리할 수 없게 되었다

 

<출처 : 위키백과 - Base64>

 

 

그래서 Base64는 ASCII 중 제어문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용하게 된다

이렇게 64개만 선정된 이유는 1bit를 처리하는 방식이 시스템 별로 상이하여 일부 제어문자의 경우 시스템 별로 다른 코드값을 가지므로 안전한 데이터 전송을 보장하기 위해 위와 같이 안전한 64개의 기초 문자들로만 맵핑하여 사용하게 되었다

 

[작동 원리]

Base64 인코딩은 다음과 같은 과정을 통해 진행

 

1. 데이터 분할: 원본 데이터를 6비트 단위로 분할하고, 6비트는 0에서 63까지의 값을 표현할 수 있으며, 이는 Base64에서 사용되는 64개의 문자와 일치

2. 문자 매핑: 분할된 각 6비트 값을 Base64에서 정의한 64개의 문자(대문자 A-Z, 소문자 a-z, 숫자 0-9, '+', '/' 등)에 매핑

3. 패딩 추가: 원본 데이터의 길이가 3의 배수가 아닐 경우, 인코딩 과정에서 '=' 문자를 사용하여 패딩을 추가해 길이를 맞추고 이것은 Base64로 인코딩 된 데이터를 올바르게 디코딩할 수 있게 해 준다

 

문자열 > ASCII binary > 6bit 분할 > Base64 인코딩

 

[예시]

예를 들어, "Man"이라는 문자열을 Base64로 인코딩하면 다음과 같은 과정을 거친다

 

1. "Man"을 ASCII 코드로 변환하면 77(M), 97(a), 110(n)

2. 이를 2진수로 표현하면 01001101, 01100001, 01101110

3. 이진수를 6비트씩 분할하여 Base64 인덱스에 매핑하면 19(T), 22(W), 5(F), 46(u)가 된다

4. 따라서 "Man"의 Base64 인코딩 결과는 "TWFu"이 된다

 

References

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

https://limvo.tistory.com/7

https://taehyeki.tistory.com/155

 

반응형