URL Encoding 이란?

2023. 3. 29. 22:19CS

728x90

URL 인코딩 (또는 퍼센트 인코딩)은

특수 문자와 기타 예약된 문자들을 웹 주소 (URL)에서

안전하게 표현하기 위해 사용되는 방법입니다.

 

이 방식은 일반적으로 웹 주소의 쿼리 문자열 부분에서 문자 인코딩을 위해 사용됩니다.

URL 인코딩은 다음과 같은 과정을 포함합니다:

  1. 대상 문자열을 인코딩할 때, 각 문자를 해당 문자의 ASCII 코드 값으로 나타냅니다.
  2. 특수 문자와 예약된 문자는 '%' 기호 뒤에 16진수 값으로 변환됩니다.
    예를 들어 공백 문자는 '%20'으로 인코딩되고, '#'은 '%23'으로 인코딩 됩니다.
  3. URL에 안전한 문자들은 변환되지 않고 그대로 사용됩니다. 이러한 문자들은 알파벳 (A-Z, a-z), 숫자 (0-9), 그리고 일부 특수 문자 (-, _,., ~) 등입니다.

URL 인코딩의 주요 목적은 웹 주소에서 사용되는 문자열이 

웹 서버와 클라이언트 간에 안전하게 전송될 수 있도록 하는 것입니다. 

이를 통해 클라이언트와 서버는 문자열의 원래 형태를 잃지 않고, 데이터를 정확하게 처리할 수 있습니다.

예를 들어, 사용자가 검색어 

"안녕하세요! 어떻게 지내세요?"

를 입력하면 

웹 브라우저는 이 문자열을 URL 인코딩하여 다음과 같이 변환합니다.

"안녕하세요!%20어떻게%20지내세요%3F"


이렇게 변환된 문자열은 웹 서버로 전송되어, 

서버는 이를 디코딩하여 원래의 문자열로 복원할 수 있습니다.

 

문자열이 인코딩 되지 않으면 안전하지 않은 경우?

예시를 보자.
만약 사용자가 "C# 프로그래밍"이라는 검색어로 구글링 한다고 해보자.

이를 URL 인코딩하지 않고 그대로 URL에 포함시키면 다음과 같은 형태의 웹 주소가 생성됩니다.

https://www.google.com/search?q=C# 프로그래밍

이때, '#' 문자는 URL에서 fragment identifier로 사용되는 예약된 문자입니다. 

따라서 웹 서버는 '#' 이후의 문자들을 무시하고, 실제로는 "C"라는 검색어만을 인식하게 됩니다.

 

이러한 문제를 해결하기 위해 URL 인코딩을 사용하면

'#' 문자가 '%23'으로 대체되어 웹 주소는 다음과 같이 변환됩니다.

https://google.com/search?q=C%23%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

이렇게 변환된 웹 주소는 웹 서버에서 정확하게 해석되어, 

사용자가 원하는 검색 결과를 얻을 수 있습니다. 

 

이처럼 인코딩 되지 않은 문자열은 예약된 문자와 특수 문자 때문에 

웹 주소가 손상되거나 웹 서버에서 잘못 해석되는 문제가 발생할 수 있습니다. 

이러한 이유로 URL 인코딩은 웹 주소에서 문자열을 안전하게 전송하는 데 필수적인 방법입니다.

 

Fragment Identifier 란?

위에서 '#'은 Fragment Identifier로 사용되는 예약된 문자라는 말을 했습니다.

이 Fragment Identifer 란 웹 페이지 내에서 특정 위치나 섹션을 가리키는 데 사용됩니다. 

브라우저는 이 식별자를 사용하여 웹 페이지를 불러온 후 자동으로 해당 위치나 섹션으로 스크롤합니다.

다음 예시를 보겠습니다.

https://en.wikipedia.org/wiki/Coffee
https://en.wikipedia.org/wiki/Coffee#History

위 두 URL 은 같은 페이지에 대한 URL이지만

첫 번째 URL은 커서의 위치가 최상단에 있고,

두 번째 URL은 커서의 위치가 "History"에 맞춰져 있는 것을 확인할 수 있습니다.

 

 

728x90

'CS' 카테고리의 다른 글

프로토콜 스택: 웹 브라우저와 운영체제 간의 통신 이해하기  (0) 2023.04.02
도커란? docker?  (0) 2023.03.31
DNS란? eTLD란?  (0) 2023.03.28
데이터베이스(Database) 란?  (0) 2023.03.22
DNS Round Rrobin 이란?  (2) 2023.03.21