본문 바로가기
정보보안

인코딩과 디코딩

by mydevjournel 2025. 2. 9.
반응형

지난번 바이트 오더링에 이어

이번에는 인코딩과 디코딩과 관련해서 알아보겠습니다!


1. 인코딩(Encoding)과 디코딩(Decoding)이란?

인코딩(Encoding) 은 정보를 특정한 형식으로 변환하는 과정을 말합니다. 반대로, 디코딩(Decoding) 은 인코딩된 정보를 원래 상태로 복원하는 과정을 의미합니다.

 

여기서 주의할 점은, 인코딩/디코딩과 암호화/복호화는 조금 다른 개념인데요. 아래 표를 통해 차이를 간단히 보시죠.

구분 인코딩/디코딩 암호화/복호화
과정 데이터 변환
목적 호환성, 전송, 저장 등 기밀성 보장, 보안 등
가시성 변환된 데이터를 표준화 방식으로 쉽게 읽을 수 있음 비밀키가 없으면 정상적으로 해석(복호화)이 불가능
예시 UTF-8, Base64, URL Encoding 등 AES, RSA, HTTPS 등

즉, 암호화/복호화는 기밀성이라는 특별한 목적을 가지고 하는 행위이기 때문에, 인코딩/디코딩과는 다른 개념입니다.

 

인코딩/디코딩은 일상생활에서도 자주 쓰이는데요. 우리가 어떠한 파일을 압축하거나 데이터를 주고받을 때, 정보가 손실되지 않게 해주는 역할을 해주고, 보안에서는 종종 데이터의 생김새를 보고 인코딩 방식을 유추해서 정보를 알아내야 할 때도 생깁니다.

 

2. 아스키코드(ASCII)

아스키코드는 우리가 입력한 문자를 컴퓨터가 알아들을 수 있게 숫자로 변환하는 문자 인코딩의 표준입니다. 이렇게 문자를 숫자로 변환함으로써 데이터 전송을 더 효율적으로 할 수 있어요. 아래 표는 문자와 아스키 값을 매칭한 표이고, 더 많은 정보를 보고 싶으시다면, https://www.asciitable.com/ 여기를 참고해 주세요.

문자 10진수 16진수
A 65 0x41
B 66 0x42
a 97 0x61
b 98 0x62
0 48 0x30
1 49 0x31
space(공백) 32 0x20

여기서 아스키 문자 1개는 1 바이트 크기로, 8 비트 중 7 비트는 문자를 표현합니다. 그래서 2^7인 128가지의 문자를 표현할 수 있죠. 그리고 나머지 1 비트는 오류 검출용 비트예요.

 

3. 유니코드(Unicode)

위와 같은 아스키코드는 미국에서 만든 표준 코드로, 알파벳 대소문자, 숫자, 특수문자, 제어 문자 등 총 128개의 문자(7비트 범위)만을 표현할 수 있었어요. 그러나 컴퓨터가 전 세계적으로 보급되고 다양한 언어를 표현해야 하는 상황이 되면서 호환성에 한계가 생겼고, 이를 위해 나온 것이 유니코드(Unicode)에요. 유니코드는 영어뿐만 아니라 전 세계 모든 언어와 문자를 통일된 방식으로 표현하기 위한 국제 표준(Charset)입니다. 이러한 유니코드의 특징은 아래와 같아요.

유니코드의 특징

  • 더 많은 문자: 최대 32비트로 문자 하나를 표현할 수 있어, 현재 약 143,000개 이상의 문자를 수용할 수 있습니다.
  • 아스키와의 관계: 유니코드의 처음 128개 문자는 아스키코드와 일치합니다. 즉, 유니코드 안에 아스키가 포함되어 있다고 볼 수 있습니다.
  • 표기 방식: 유니코드 코드 포인트는 보통 U+ 뒤에 16진수를 붙여 표기합니다. (예: U+AC00 = ‘가’)

이런 유니코드를 실제 컴퓨터나 네트워크 환경에서 사용하기 위해서는 인코딩(Encoding) 과정이 필요한데, 이는 컴퓨터가 어떤 문자를 어떻게 읽어야 되는지 미리 정해주는 과정이에요. 이때 사용하는 대표적인 인코딩 방식으로는 UTF-8, UTF-16, UTF-32 등이 있어요. 그리고 UTF 뒤의 숫자는 문자를 표현하는 데 쓰이는 비트 수를 의미해요. 예를 들어 UTF-8은 1~4 바이트의 가변적인 크기로 문자 1개를 표현하는 방식으로, 이는 아스키코드와 유사합니다. 또한 현재 컴퓨터로 볼 수 있는 글자는 대부분 UTF-8로 인코딩 된 값입니다. 

 

4. URL 인코딩 (퍼센트 인코딩)

웹에서 사용되는 URL은 알파벳 대소문자, 숫자, 그리고 일부 특수 문자만 포함할 수 있어요. 그리고 이때 웹 브라우저로부터 받은 URL 문자열을 유효한 형식으로 변환하는 것을 URL 인코딩이라고 해요. 여기서 특수 문자 중 인코딩이 필요한 문자는 ":/?#[]@!$&'()*+,;=%공백" 이 있어요.

이러한 특수 문자를 인코딩하는 방법은 바로 퍼센트(%) 뒤에 해당 문자의 아스키코드 16진수 값을 붙여 나타내는 건데요.

예를 들어 '공백'의 경우, URL 인코딩 값은 '+' 또는 '%20'으로 결정됩니다. 이런 방식으로 전송과정에서 문자가 수정되거나 왜곡되는 것을 방지합니다. 

 

5. Base64 인코딩

Base64 인코딩은 이진 데이터를 아스키 문자로 구성된 텍스트로 변환하는 인코딩 방식입니다. 여기서 Base64라는 이름의 의미는 총 64개의 아스키 문자가 인코딩에 사용되기 때문에 64진법(Base 64)이라는 의미에서 붙여졌다고 해요. 그리고 이때 64개의 아스키 문자는 알파벳 대소문자(52자), 숫자(10자), +, / 로 구성되어 있어요. 이러한 Base64 인코딩은 이진 데이터를 그대로 포함할 수 없이 텍스트만 허용되는 환경에서 이진 데이터를 텍스트로 나타내기 위해 사용합니다.

다음은 Base64 인코딩 방식이에요.

  1. 원본 이진 데이터를 비트 나열로 표현하고, 이를 6 비트씩 끊어서 묶습니다. 만약 비트의 개수가 6의 배수가 아닐 경우, 0을 뒤에 추가하여 6의 배수로 만듭니다.
  2. 각 6 비트 묶음을 수로 변환한 뒤, Base64 인덱스에 해당하는 문자로 치환합니다.(Base64 테이블: https://www.garykessler.net/library/base64.html)
  3. 이후 글자 수가 4의 배수가 되도록 문자 '='를 반복해 뒤에 추가합니다. 이를 패딩(Padding)이라고 합니다.

참고로 패딩은 디코딩할 때 총비트의 개수가 8의 배수가 되도록 해주기 위해 사용합니다.

반응형