본문 바로가기
Web Hacking

[Web Hacking] 인코딩 및 Character Set

by spareone 2026. 3. 10.

컴퓨터는 문자를 그대로 이해하지 못하고, 결국 숫자(바이트) 로 처리합니다.
따라서 우리가 입력한 안녕?, ABC123 같은 문자열은 내부적으로는 특정 규칙에 따라 숫자로 바뀌어 저장되거나 전송됩니다.

이때 중요한 개념이 바로 문자집합Character Set 과 인코딩(Encoding) 입니다.

 

1. Character Set

문자를 숫자에 매핑한 것을 문자 집합이라고 합니다.

 

Ex) A -> 65, B -> 66 등

 

대표적인 문자집합:

  • ASCII
  • EUC-KR
  • Shift_JIS
  • UTF-8
  • UTF-16
  • CP949 (한글 Windows 계열에서 많이 사용)
  • 일본 Windows 코드페이지 (대표적으로 Shift_JIS 계열)

즉, 같은 문자라도 어떤 문자집합/인코딩 규칙을 쓰느냐에 따라 저장되는 바이트 값이 달라질 수 있습니다.

 

 

2. ASCII Code

ASCII는 영어, 숫자, 특수문자 등을 표현하는 기본적인 캐릭터셋입니다.

 

[그림 1] ASCII Code표

 

하지만 이것으로 한글 등 다른 나라 문자를 표현할 수 없습니다.

이러한 문제를 해결하기 위해 더 큰 문자집합이 필요합니다.

 

3. Encoding

 

한글 Windows에서 '안녕?' 이라고 쓴 뒤 일본 Windows 사용하는 친구에게 채팅을 치면 '뷁궥ㄹ뤡' 이런식으로 될 것입니다.

이걸 그대로 다시 한글 Windows로 가져오면 '불굮뢉ㄱ' 이렇게 될 것입니다.

 

서로 사용하는 문자집합과 인코딩 방식이 다르기 때문에 발생하는 문제입니다.

 

즉, 데이터 자체가 망가진 게 아니라,
같은 바이트를 다른 문자표로 읽어서 깨져 보이는 것입니다.

이 현상을 흔히 문자 인코딩 깨짐(모지바케, mojibake) 이라고 합니다.

 

예를 들어 안녕? 를 어떤 인코딩으로 바이트로 저장했다고 가정해보겠습니다.

  1. 사용자가 안녕? 입력
  2. 시스템이 이를 특정 인코딩(CP949, UTF-8 등)으로 바이트 변환
  3. 다른 시스템이 그 바이트를 다른 인코딩 방식으로 해석
  4. 결과: 뷁궥ㄹ뤡 같은 깨진 문자열 출력

핵심은 이겁니다.

  • 인코딩: 문자를 바이트로 바꾸는 과정
  • 디코딩: 바이트를 문자로 해석하는 과정
  • 인코딩/디코딩 규칙이 서로 다르면 글자가 깨짐

 

4. URL Encoding

URL에는 한글, 공백, 특수문자 등을 그대로 넣기 어려운 경우가 많습니다.
그래서 웹에서는 URL에 안전하게 넣기 위해 퍼센트 인코딩(percent-encoding) 을 사용합니다.

 

예시:

대디펫 → %EB%8C%80%EB%94%94%ED%8E%AB

 

이 %EB%8C%80... 형태는 보통 UTF-8 바이트를 16진수로 표현한 것입니다.

 

네이버에 한글로 키워드 검색 후 URL을 자세히 보면

https://search.naver.com/search.naver?...&query=%EB%8C%80%EB%94%94%ED%8E%AB

 

query 값에 한글이 인코딩 되어 있는 것을 확인할 수 있습니다.

 

브라우저는 이 값을 URL 디코딩해서 다시 원래 문자열 대디펫 으로 해석합니다.

 

5. Base64 Encoding

Base64는 데이터를 64개의 문자만 사용해서 텍스트처럼 표현하는 방식입니다.

주로 이런 경우에 사용합니다.

  • 바이너리 데이터를 텍스트 환경에서 안전하게 전송할 때
  • 이메일 첨부
  • JSON/XML에 바이너리 포함
  • 토큰, 이미지 데이터 전달 등

[그림 2] '안녕'을 Base64로 변환한 모습

 

 

Base64의 중요한 특징:

  • 암호화가 아님
  • 규칙만 알면 누구나 다시 원문 복원 가능
  • 목적은 숨김이 아니라 표현/전송 편의성

즉, Base64는 보안 기능이 아닙니다.

 

 

7. HTML Encoding

HTML에서는 <, >, &, " 같은 문자가 태그로 해석될 수 있습니다.
그래서 이를 안전하게 출력하기 위해 HTML 엔티티로 인코딩하여 사용합니다.

 

예시:

  • < → &lt;
  • > → &gt;
  • & → &amp;

숫자 엔티티도 가능합니다.

  • &#65; → A
  • &#44032; → 가

즉 HTML Encoding은 아래의 역할을 수행합니다.

  • 브라우저가 문자를 태그로 오해하지 않게 함
  • 웹페이지에 문자를 안전하게 표시하기 위한 용도

 

 

8. 인코딩과 암호화의 차이

인코딩(Encoding)

데이터를 다른 형식으로 표현하는 것입니다.

 

목적:

  • 저장
  • 전송
  • 호환성
  • 표현 규칙 통일

예시:

  • UTF-8
  • URL Encoding
  • Base64
  • HTML Encoding

특징:

  • 규칙만 알면 누구나 디코딩 가능
  • 기밀성 보장 목적이 아님

 

암호화(Encryption)

데이터를 인가된 사람만 읽을 수 있도록 변환하는 것입니다.

목적:

  • 기밀성(confidentiality)

예시:

  • AES
  • RSA

특징:

  • 키가 있어야 복호화 가능
  • 단순 인코딩과 달리, 아무나 바로 읽을 수 없게 하는 것이 목적

댓글