Spring ‐ URL 인코딩 - woojin-playground/Backend-PlayGround GitHub Wiki

📚 URL 인코딩

  • HTTP 메시지에서 시작 라인(URL 포함)과 HTTP 헤더의 이름은 항상 ASCII를 사용한다.
  • HTTP 메시지 바디는 UTF-8과 같은 다른 인코딩을 사용할 수 있다.
  • HTTP에서 URL이 ASCII 문자를 사용하는 이유는 다음과 같다.
    • 인터넷이 처음 설계되던 시기에 대부분의 컴퓨터 시스템은 ASCII 문자 집합을 사용했다.
    • 전 세계에서 사용하는 다양한 컴퓨터 시스템과 네트워크 장비 간 호환성을 보장하기 위해, URL은 단일한 문자 인코딩 체계를 사용해야 했다. 그 당시 모든 시스템이 비 ASCII 문자를 처리할 수 없었기 때문에 ASCII는 가장 보편적이고 일관된 선택이었다.
    • HTTP URL이 ASCII만을 지원하는 이유는 초기 인터넷의 기술적 제약과 전 세계적인 호환성을 유지하기 위한 선택이다.
    • 순수한 UTF-8로 URL을 표현하려면 전 세계 모든 네트워크 장비, 서버, 클라이언트 소프트웨어가 이를 지원해야 한다. 그러나 여전히 많은 시스템에서 ASCII 기반 표준에 의존하고 있기 때문에 순수한 UTF-8 URL을 사용하면 호환성 문제가 발생할 수 있다.
    • HTTP 스펙은 매우 보수적이고 호환성을 가장 우선시한다.

퍼센트(%) 인코딩

  • 한글을 UTF-8 인코딩으로 표현하면 한 글자에 3byte의 데이터를 사용한다.
  • URL은 ASCII 문자만 표현할 수 있으므로 UTF-8 문자를 표현할 수 없다.
  • % 인코딩 후에 클라이언트에서 서버로 데이터를 전달하면 서버는 각각의 %를 제거하고, 문자를 취한다.

% 인코딩/디코딩 진행 과정

  1. 클라이언트: "가" 전송 희망
  2. 클라이언트: %인코딩, %EA%B0%80
  • "가"를 UTF-8로 인코딩
  • EA, B0, 80 3byte 획득
  • 각 byte를 16진수 문자로 표현하고 각각의 앞에 %를 붙임
  1. 클라이언트 → 서버 전송
  2. 서버: ASCII 문자를 전달 받음
  • %가 붙은 경우 디코딩해야 하는 문자로 인식
  • EA, B0, 80를 byte로 변환, 3byte를 획득
  • EA, B0, 80(3byte)를 UTF-8로 디코딩 → 문자 "가"를 획득

% 인코딩

  • Java가 제공하는 URLEncoder.encode(), URLEncoder.decode()를 사용하면 % 인코딩/디코딩을 처리할 수 있다.
  • % 인코딩은 데이터 크기에서 보면 효율성이 떨어진다. 문자 "가"는 단지 3byte만 필요하다. 그러나 % 인코딩을 처리하게 되면 무려 9byte가 사용된다.