이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.14 23:09
URL은 인터넷 상에 존재하는 자원의 위치를 가리키는 주소 체계이다. 'Uniform Resource Locator'의 약자로, '자원의 위치를 지정하는 통일된 형식'을 의미한다. 웹 페이지, 이미지, 동영상, 문서 등 네트워크를 통해 접근 가능한 모든 정보는 고유한 URL을 가진다.
사용자가 웹 브라우저의 주소창에 URL을 입력하거나 링크를 클릭하면, 브라우저는 해당 주소에 위치한 서버에 접속하여 자원을 요청하고 화면에 표시한다. 이는 인터넷의 핵심적인 작동 원리 중 하나이다. URL은 단순히 웹사이트 주소뿐만 아니라 FTP를 통한 파일 전송, 이메일 주소 지정(mailto:), 데이터베이스 연결 등 다양한 프로토콜을 이용한 자원 접근에 사용된다.
URL의 표준은 월드 와이드 웹 컨소시엄(W3C)과 인터넷 엔지니어링 태스크 포스(IETF)에 의해 관리되며, RFC 3986 문서에 공식적으로 정의되어 있다[1]. 이는 전 세계적으로 통용되는 일관된 형식을 보장하여, 서로 다른 시스템 간의 원활한 정보 교환을 가능하게 한다.
URL은 인터넷 상의 자원 위치를 지정하는 문자열로, 여러 구성 요소가 조합된 구조를 가진다. 일반적인 URL은 다음과 같은 형식을 따른다.
스킴://권한/경로?쿼리#프래그먼트
각 구성 요소는 특정한 역할을 담당하며, 모든 요소가 항상 존재하는 것은 아니다.
구성 요소 | 설명 | 예시 (https://www.example.com:443/docs/page?q=term#section) |
|---|---|---|
사용할 프로토콜을 지정한다. |
| |
자원이 위치한 서버 정보를 포함한다. 사용자 정보, 호스트, 포트로 구성될 수 있다. |
| |
서버 내에서 특정 자원의 위치를 나타낸다. |
| |
서버에 추가 정보를 제공하는 매개변수다. |
| |
자원 내의 특정 부분(예: 문서의 한 단락)을 가리킨다. |
|
권한(authority) 부분은 다시 세부 요소로 나뉜다. 사용자정보@호스트:포트 형식으로, 사용자 정보와 포트는 생략 가능하다. 호스트는 도메인 이름이나 IP 주소로 표현된다. 스킴에 따라 기본 포트가 정해져 있어(예: HTTP는 80, HTTPS는 443), 기본 포트를 사용할 경우 포트 번호는 생략하는 것이 일반적이다. 쿼리 문자열은 여러 매개변수를 & 기호로 연결하여 ?key1=value1&key2=value2 형태로 사용한다. 프래그먼트는 서버로 전송되지 않고, 클라이언트(브라우저)가 자원을 받은 후 내부적으로 처리한다.
스킴은 URL의 첫 번째 구성 요소로, 자원에 접근하는 데 사용할 프로토콜이나 프로시저를 지정합니다. 콜론(:)으로 끝나며, URL의 나머지 부분을 해석하는 방법을 정의합니다. 가장 흔한 예는 HTTP와 HTTPS이며, 각각 http:와 https:로 표시됩니다. 이 외에도 FTP(ftp:), 메일토(mailto:), 파일(file:) 등 다양한 스킴이 존재합니다.
스킴은 클라이언트(예: 웹 브라우저)나 서버가 어떤 통신 규칙을 사용해야 하는지를 알려줍니다. 예를 들어, http: 스킴은 서버와의 표준 하이퍼텍스트 통신을, https:는 암호화된 보안 연결을 사용하도록 지시합니다. mailto: 스킴은 이메일 클라이언트를 실행시키고, ftp:는 파일 전송 프로토콜을 통해 파일 서버에 접근하게 합니다.
일부 스킴은 권한 구성 요소(예: //example.com)를 필요로 하지만, mailto:나 news:와 같은 스킴은 이를 요구하지 않을 수 있습니다. 스킴 이름은 대소문자를 구분하지 않으며, 일반적으로 소문자로 작성하는 것이 관례입니다. 스킴의 존재는 URL을 다른 종류의 식별자나 주소와 구분하는 핵심 특징입니다.
권한 부분은 URL에서 자원이 위치한 서버나 네트워크 위치를 식별하는 구성 요소이다. 이 부분은 일반적으로 호스트를 포함하며, 선택적으로 포트 번호와 사용자 정보(사용자명과 비밀번호)를 포함할 수 있다. 권한 구성 요소는 스킴 다음에 콜론 두 개(://)로 시작하여 구분된다.
권한의 가장 핵심 요소는 호스트이다. 호스트는 도메인 이름(예: www.example.com)이나 IP 주소(예: 192.0.2.1)로 표현된다. 호스트 앞에는 선택적으로 사용자 정보가 올 수 있으며, 이는 사용자명:비밀번호@ 형식으로 표기한다. 그러나 보안상의 이유로 현대에는 자격 증명을 URL에 직접 포함하는 방식은 거의 사용되지 않는다. 호스트 뒤에는 콜론(:)으로 구분하여 포트 번호를 지정할 수 있다. 포트는 특정 네트워크 서비스를 식별하는 논리적인 통로이다. 만약 포트가 생략되면, 스킴에 따라 기본 포트가 사용된다(예: HTTP는 80, HTTPS는 443).
다음은 권한 구성 요소의 구조를 보여주는 표이다.
구성 요소 | 설명 | 예시 | 필수 여부 |
|---|---|---|---|
사용자 정보 | 서버 접근을 위한 자격 증명. |
| 선택 |
호스트 | 서버의 도메인 이름 또는 IP 주소 |
| 필수 |
포트 | 네트워크 서비스 포트 번호 |
| 선택 (기본값 사용) |
권한 부분은 DNS를 통해 호스트 이름을 IP 주소로 변환하는 과정을 거쳐, 클라이언트(예: 웹 브라우저)가 올바른 서버에 연결할 수 있도록 한다. 포트 지정은 동일한 서버에서 여러 서비스(예: 웹 서버와 메일 서버)를 구분하여 실행할 때 중요하게 작동한다.
경로는 URL에서 서버 내부의 특정 리소스나 디렉터리의 위치를 지정하는 부분이다. 권한 구성 요소 뒤에 슬래시(/)로 시작하며, 서버의 파일 시스템 구조나 논리적 계층을 반영하는 계층적 구조를 가진다.
경로는 일반적으로 디렉터리와 파일명을 슬래시(/)로 구분하여 표현한다. 예를 들어, /wiki/URL이라는 경로는 최상위 루트 디렉터리 아래의 wiki 디렉터리 내에 있는 URL이라는 리소스를 가리킨다. 현대의 웹 애플리케이션에서는 실제 물리적 파일 구조가 아닌, 라우팅을 위한 논리적 경로로 사용되는 경우가 많다.
경로 구성 요소는 선택 사항이다. 경로가 생략된 URL(예: https://example.com)은 일반적으로 서버에 정의된 기본 리소스(예: index.html)를 요청한다. 경로의 구분자 슬래시(/)는 예약 문자에 속하므로, 경로 내에서 일반 문자로 사용해야 할 경우 퍼센트 인코딩(%2F)을 통해 표현해야 한다.
쿼리 문자열은 URL에서 물음표(?)로 시작하여 프래그먼트가 있다면 해시(#) 전까지, 없다면 URL의 끝까지 이어지는 부분이다. 주로 웹 서버에 추가적인 매개변수를 전달하는 데 사용된다. 이는 사용자가 검색을 하거나, 필터를 적용하거나, 폼 데이터를 제출할 때 서버에 정보를 보내는 표준적인 방법이다.
쿼리 문자열은 일반적으로 키=값 쌍으로 구성되며, 여러 개의 쌍이 있을 경우 앰퍼샌드(&)로 구분된다. 예를 들어, ?category=books&sort=date라는 쿼리는 'category' 키에 'books' 값을, 'sort' 키에 'date' 값을 할당하여 서버에 전달한다. 키와 값은 반드시 URL 인코딩을 통해 안전한 문자 집합으로 변환되어야 한다. 예를 들어 공백은 %20 또는 더하기 기호(+)로 인코딩된다.
구성 요소 | 설명 | 예시 |
|---|---|---|
시작 구분자 | 쿼리 문자열의 시작을 나타냄 |
|
키-값 쌍 | 전달할 데이터의 이름과 내용 |
|
구분자 | 여러 키-값 쌍을 구분함 |
|
인코딩 | 예약 문자 등을 안전한 형식으로 변환함 | 공백 → |
서버 측 애플리케이션은 이 쿼리 문자열을 파싱하여 사용자의 요청을 처리한다. PHP의 $_GET, 파이썬의 cgi.FieldStorage(), 자바스크립트의 URLSearchParams와 같은 도구들이 이를 위한 내장 기능을 제공한다. 쿼리 문자열은 상태가 없는 HTTP 프로토콜에서 특정 리소스에 대한 임시적인 상태나 옵션을 지정하는 중요한 수단으로 작동한다.
프래그먼트는 URL의 마지막 구성 요소로, 해시(#) 기호 뒤에 오는 부분을 가리킨다. 이 부분은 서버로 전송되지 않으며, 브라우저가 리소스 내부의 특정 지점을 식별하는 데 사용한다. 주로 HTML 문서 내의 특정 앵커 요소나 미디어 파일의 특정 시점으로 이동할 때 활용된다.
프래그먼트의 주요 용도는 다음과 같다.
* 문서 내부 탐색: 긴 웹 페이지에서 특정 제목이나 단락으로 바로 스크롤할 수 있게 한다. 예를 들어, #역사라는 프래그먼트는 해당 페이지에서 id="역사" 속성을 가진 요소로 이동시킨다.
* 미디어 조각 식별: 비디오나 오디오 파일의 특정 재생 시간대로 이동할 때 사용된다. 예를 들어, #t=120은 120초 지점부터 재생을 시작하도록 지시한다.
* 단일 페이지 애플리케이션(SPA) 내비게이션: 자바스크립트 기반의 현대 웹 애플리케이션에서 화면 전환을 관리하는 데 활용되기도 한다.
프래그먼트는 서버에 요청을 보내지 않기 때문에 페이지를 새로고침하지 않고도 콘텐츠의 특정 부분을 보여줄 수 있다. 이는 사용자 경험을 향상시키고 대역폭을 절약하는 데 기여한다. 또한, 프래그먼트가 포함된 URL을 공유하면 받는 사람이 정확히 같은 콘텐츠 지점부터 볼 수 있다는 장점이 있다.
URL의 개념과 초기 구조는 1990년 팀 버너스리에 의해 제안되었다. 그는 월드 와이드 웹 프로젝트의 일환으로, 네트워크 상의 자원을 고유하게 식별하고 위치를 지정할 수 있는 주소 체계가 필요했고, 이를 해결하기 위해 URL을 고안했다. 초기에는 정보 문서(리소스)의 위치를 나타내는 단순한 문자열 형식으로 시작했다.
URL의 표준화는 IETF(국제 인터넷 표준화 기구)에서 발행하는 RFC(비평을 위한 요청) 문서를 통해 진행되었다. URL에 대한 최초의 공식 표준은 1994년에 발표된 RFC 1738[2]이었다. 이 문서는 URL의 전체 문법과 http:, ftp:, mailto: 등 여러 스킴의 구체적인 형식을 정의했다. 이후 1998년에 발표된 RFC 2396[3]은 URL과 URN을 모두 포괄하는 더 일반적인 개념인 URI의 통합 문법을 제시하며 표준을 확장했다.
URL, URN, URI는 밀접한 관계를 가지지만 서로 다른 개념이다. URI는 인터넷 상의 자원을 식별하는 문자열을 포괄하는 가장 상위 개념이다. URI는 크게 두 가지 하위 유형으로 나뉜다. 하나는 자원의 '위치'를 나타내는 URL이며, 다른 하나는 자원의 '이름'을 나타내는 URN이다. 모든 URL은 URI이지만, 모든 URI가 URL인 것은 아니다. 예를 들어, ISBN 번호처럼 위치가 변하지 않는 고유한 이름을 지정하는 URN은 URI에 속하지만 URL은 아니다. 이 관계는 2005년에 발표된 RFC 3986[4]에서 명확히 정의되었으며, 이 문서가 현재 URI 문법의 최신 표준으로 자리 잡았다.
용어 | 의미 | 관계 | 예시 |
|---|---|---|---|
URI (Uniform Resource Identifier) | 자원을 식별하는 통합 자원 식별자 | 상위 개념 |
|
URL (Uniform Resource Locator) | 자원의 위치(네트워크 상 주소)를 지정 | URI의 하위 유형, 위치 기반 |
|
URN (Uniform Resource Name) | 자원의 고유하고 지속적인 이름을 지정 | URI의 하위 유형, 이름 기반 |
|
이 표준화 과정을 통해 URL은 단순한 아이디어에서 인터넷의 핵심 인프라 중 하나로 자리 잡게 되었다.
URL의 표준화와 발전은 주로 IETF에서 발행하는 RFC 문서를 통해 이루어졌다. 초기 개념은 1994년 팀 버너스리에 의해 제안되었으며, 월드 와이드 웹의 핵심 요소로 자리 잡았다.
공식적인 표준화는 RFC 1738 "Uniform Resource Locators (URL)"에서 시작되었다. 이 문서는 URL의 일반 문법과 특정 스킴의 구체적 문법을 정의했다. 이후 1998년 RFC 2396 "Uniform Resource Identifiers (URI): Generic Syntax"가 등장하며, URI의 일반 문법을 통합적으로 정의했고, URL은 URI의 하위 개념으로 자리매김했다. 최종적으로는 2005년 RFC 3986 "Uniform Resource Identifier (URI): Generic Syntax"가 현재의 표준 문법을 확립했다[5].
RFC 문서의 발전 과정을 연표로 정리하면 다음과 같다.
연도 | RFC 번호 | 제목 | 주요 내용 및 의의 |
|---|---|---|---|
1994 | RFC 1738 | Uniform Resource Locators (URL) | URL에 대한 최초의 표준 제안. 절대 URL과 상대 URL, 주요 스킴 정의. |
1995 | RFC 1808 | Relative Uniform Resource Locators | 상대 URL 해석 알고리즘을 표준화. |
1998 | RFC 2396 | Uniform Resource Identifiers (URI): Generic Syntax | URI에 대한 통합 문법 정의. URL과 URN을 포괄하는 상위 개념 정립. |
2005 | RFC 3986 | Uniform Resource Identifier (URI): Generic Syntax | 현재의 표준. URI 문법을 재정의하고, 국제화 리소스 식별자(IRI) 개념을 고려. |
이러한 표준화 과정을 통해 URL은 단순한 주소 체계를 넘어, 인터넷 상의 자원을 체계적으로 식별하고 접근하는 데 필수적인 표준 프로토콜로 발전했다.
URI(Uniform Resource Identifier)는 인터넷 상의 자원을 식별하는 문자열의 가장 포괄적인 개념이다. URI는 자원의 위치를 나타내는 URL(Uniform Resource Locator)과 자원의 이름을 나타내는 URN(Uniform Resource Name) 두 가지 주요 하위 개념으로 나뉜다. 모든 URL과 URN은 URI이지만, 모든 URI가 URL이나 URN인 것은 아니다.
URL과 URN의 가장 큰 차이는 자원의 위치와 이름에 있다. URL은 http://, ftp://와 같은 프로토콜과 호스트명, 경로를 포함하여 자원의 구체적인 위치와 접근 방법을 지정한다. 예를 들어 https://www.example.com/page.html은 그 자원이 어디에 있는지 위치를 알려준다. 반면, URN은 위치에 독립적인 영구적인 자원의 이름을 제공하는 것을 목표로 한다. urn:isbn:0451450523과 같은 형식은 특정 책을 고유하게 지칭하지만, 그 책을 어디서 얻을 수 있는지는 알려주지 않는다.
실제 웹에서 가장 널리 사용되는 것은 URL이다. URN은 개념적으로는 유용하지만, 널리 구현되거나 채택되지는 못했다. 따라서 현실에서는 URI와 URL이라는 용어가 종종 혼용되어 사용되기도 한다. 기술적으로는 URI가 더 넓은 범주이며, URL은 그 하위 집합이다.
URL은 ASCII 문자 집합을 기반으로 설계되었다. 따라서 URL에 ASCII 문자 집합에 속하지 않는 문자(예: 한글, 한자, 이모지)나 특정 ASCII 예약 문자(예: 공백, 물음표, 앰퍼샌드)를 그대로 사용할 수 없다. 이를 해결하기 위해 고안된 방법이 퍼센트 인코딩(Percent-Encoding)이다.
퍼센트 인코딩은 안전하지 않은 문자를 퍼센트 기호('%')와 그 문자의 16진수 ASCII 코드 값 두 자리로 변환한다. 예를 들어, 공백 문자(ASCII 코드 32, 16진수 20)는 '%20'으로, 물음표 '?'(ASCII 코드 63, 16진수 3F)는 '%3F'로 인코딩된다. 비ASCII 문자(예: UTF-8로 인코딩된 문자)는 해당 문자의 UTF-8 인코딩된 바이트 시퀀스를 각 바이트별로 퍼센트 인코딩한다. 예를 들어, 한글 '가'는 UTF-8로 3바이트(0xEA, 0xB0, 0x80)로 표현되므로 '%EA%B0%80'으로 인코딩된다.
URL에서 사용 가능한 문자는 예약 문자, 비예약 문자, 퍼센트 인코딩된 문자로 구분된다. 비예약 문자는 알파벳(A-Z, a-z), 숫자(0-9), 하이픈(-), 밑줄(_), 마침표(.), 물결(~) 등으로, URL의 어느 부분에서도 그대로 사용할 수 있다. 예약 문자는 URL 구조 내에서 특별한 의미를 가지는 문자들이다. 주요 예약 문자와 그 용도는 다음과 같다.
문자 | 용도 |
|---|---|
| |
| 쿼리 문자열 등에서 특정 의미를 가짐 |
| 퍼센트 인코딩 자체를 나타냄 |
예약 문자는 의도된 용도로 사용될 때는 그대로 쓰지만, 그 용도가 아닌 일반 데이터(예: 쿼리 문자열의 값)의 일부로 포함되어야 할 경우 반드시 퍼센트 인코딩되어야 한다. 예를 들어, 쿼리 문자열에서 key=value&name의 '&'는 매개변수 구분자이므로, 값에 '&' 문자 자체를 포함하려면 key=value%26name과 같이 인코딩해야 한다.
퍼센트 인코딩은 URL에서 특정 문자를 안전하게 표현하기 위한 메커니즘이다. 이는 ASCII 문자 집합에 포함되지 않거나, URL 문법에서 특별한 의미를 가지는 '예약 문자'를 URL에 포함시킬 때 사용된다. 인코딩은 퍼센트 기호('%') 뒤에 해당 문자의 ASCII 코드를 16진수(hexadecimal) 두 자리로 나타내는 방식으로 이루어진다[6].
주요 인코딩 대상은 다음과 같다.
문자 | URL에서의 역할 | 인코딩 값 |
|---|---|---|
공백 | 경로나 쿼리에서 구분자로 사용될 수 있음 | %20 |
! | 예약 문자 | %21 |
# | 프래그먼트 구분자 | %23 |
% | 인코딩 자체에 사용 | %25 |
& | 쿼리 문자열에서 매개변수 구분자 | %26 |
+ | 쿼리에서 공백을 나타내는 경우도 있음 | %2B (또는 실제 더하기 기호로 사용) |
/ | 경로 구분자 | %2F |
= | 쿼리에서 키-값 구분자 | %3D |
? | 쿼리 문자열 시작 구분자 | %3F |
@ | 권한 부분에서 사용 | %40 |
이 인코딩은 쿼리 문자열을 통해 데이터를 전송할 때 특히 중요하다. 예를 들어, 검색어 "안녕 하세요"는 "안녕%20하세요"와 같이 인코딩되어 전송된다. 또한, 영어가 아닌 문자(예: 한글, 한자)나 이모지와 같은 유니코드 문자는 일반적으로 UTF-8과 같은 문자 인코딩 방식으로 바이트 시퀀스로 변환된 후, 각 바이트가 퍼센트 인코딩된다[7].
웹 브라우저나 서버 측 애플리케이션은 URL을 해석할 때 이 인코딩된 문자열을 원래의 문자로 자동 변환(디코딩)한다. 개발자는 데이터를 URL에 포함시킬 때 적절히 인코딩해야 하며, 수신 측에서는 안전하게 디코딩하여 처리해야 한다. 이를 통해 다양한 문자로 구성된 데이터도 URL을 통해 오류 없이 전달될 수 있다.
URL에서 사용 가능한 문자는 퍼센트 인코딩 규칙에 따라 예약 문자(reserved characters)와 비예약 문자(unreserved characters)로 구분된다. 이 구분은 해당 문자가 URL 내에서 특별한 의미(구분자 역할)를 가지는지, 아니면 데이터 자체를 나타내는 데 자유롭게 사용될 수 있는지에 기반한다.
비예약 문자는 URL의 어느 부분에서도 그대로 사용할 수 있는 안전한 문자 집합이다. 이는 대소문자 영문 알파벳(A-Z, a-z), 숫자(0-9), 그리고 하이픈(-), 밑줄(_), 마침표(.), 물결표(~) 네 개의 특수 문자로 구성된다[8]. 이 문자들은 퍼센트 인코딩으로 변환되지 않아도 되며, 일반적으로 리터럴 데이터를 표현하는 데 사용된다.
반면, 예약 문자는 URL 구조에서 구분자(delimiter) 역할을 하기 위해 예약되어 있다. 따라서 이 문자들을 해당 구분자 역할이 아닌, 데이터의 일부로 사용하려면 반드시 퍼센트 인코딩되어야 한다. 주요 예약 문자와 그 일반적인 용도는 다음과 같다.
문자 | 일반적 용도 |
|---|---|
| |
| 권한(authority)과 경로(path)를 구분, 경로 세그먼트 구분자 |
| 쿼리 문자열의 시작을 표시 |
| 프래그먼트의 시작을 표시 |
| IPv6 주소를 감싸는 데 사용 |
| 사용자 정보(예: 아이디:비밀번호)와 호스트를 구분 |
| 쿼리 문자열 등에서 다양한 구분자 역할 |
예를 들어, 쿼리 문자열에서 &는 일반적으로 키-값 쌍을 구분하는 데 사용된다. 따라서 실제 값에 & 문자를 포함시키려면 %26으로 인코딩해야 한다. 이 규칙을 준수하지 않으면 URL 파서가 구조를 잘못 해석하여 오류를 일으키거나 의도하지 않은 동작을 초래할 수 있다.
절대 URL은 인터넷 상에서 특정 리소스의 완전하고 독립적인 주소를 제공한다. 스킴(HTTP, HTTPS, FTP 등)부터 시작하여 권한(호스트명), 경로, 그리고 필요한 경우 쿼리와 프래그먼트까지 모든 구성 요소를 포함한다. 예를 들어, https://www.example.com/docs/page.html은 절대 URL이다. 이 주소는 어느 웹 페이지에서 사용되든 동일한 리소스를 가리키며, 그 자체만으로도 리소스의 위치를 완전히 식별할 수 있다.
반면, 상대 URL은 현재 문서의 위치(기준 URL)를 기준으로 상대적인 경로만을 표시한다. 상대 URL은 스킴과 권한 부분을 생략하며, 경로만으로 구성되거나 선행 슬래시(/)로 시작할 수 있다. 상대 URL의 해석은 항상 현재 문서의 절대 URL을 기준으로 이루어진다. 예를 들어, 현재 페이지가 https://www.example.com/docs/index.html일 때, 상대 URL image.jpg는 https://www.example.com/docs/image.jpg로 해석되고, /assets/logo.png는 https://www.example.com/assets/logo.png로 해석된다.
URL 유형 | 예시 | 설명 |
|---|---|---|
절대 URL |
| 프로토콜, 호스트, 포트, 경로, 쿼리, 프래그먼트 등 모든 정보를 포함한 완전한 주소이다. |
상대 URL (문서 기준) |
| 현재 문서가 위치한 디렉토리를 기준으로 한 상대 경로이다. |
상대 URL (루트 기준) |
| 웹 사이트의 루트 디렉토리( |
상대 URL (상위 디렉토리) |
| 현재 디렉토리의 상위 디렉토리로 이동한 후의 경로를 나타낸다. |
상대 URL은 주로 같은 웹 사이트 내부의 리소스를 연결할 때 사용된다. 이는 코드의 이식성을 높이고, 사이트의 기본 주소가 변경되더라도 내부 링크를 쉽게 관리할 수 있게 한다. 반면, 외부 사이트로의 링크나 이메일, 스크립트에서 리소스를 명시적으로 참조할 때는 절대 URL이 필수적이다. 웹 브라우저와 서버는 이러한 규칙에 따라 상대 URL을 현재 요청의 컨텍스트를 이용해 절대 URL로 변환하여 처리한다.
URL 단축 서비스는 긴 URL을 짧은 형태의 URL로 변환해주는 서비스이다. 사용자가 복잡하고 기억하기 어려운 긴 링크를 짧고 간편하게 공유할 수 있도록 돕는 것이 주된 목적이다. 이러한 서비스는 마이크로블로그나 문자 메시지처럼 글자 수 제한이 있는 플랫폼에서 특히 유용하게 사용된다. 단축된 URL은 원본 긴 URL로의 리디렉션 역할을 수행하며, 서비스 제공자는 클릭 수, 접속 지역, 접속 기기 등의 트래픽 분석 데이터를 추가로 제공하기도 한다.
주요 URL 단축 서비스의 예는 다음과 같다.
서비스명 | 특징 |
|---|---|
가장 널리 알려진 서비스 중 하나로, 링크 관리 및 분석 기능을 제공한다. | |
역사가 긴 초기 서비스로, 별도의 가입 없이도 사용할 수 있는 간편함이 특징이다. | |
Hootsuite 소셜 미디어 관리 도구에 통합된 서비스이다. | |
구글이 제공했으나 2019년 서비스가 종료되었다[9]. |
URL 단축 서비스는 편의성을 제공하지만 몇 가지 주의점도 존재한다. 단축된 URL은 목적지를 미리 확인하기 어려워 피싱이나 악성 소프트웨어 배포에 악용될 수 있다. 또한 서비스 제공자가 운영을 중단하면 모든 단축 링크가 작동하지 않게 되어 정보 접근에 장애가 발생할 수 있다. 일부 서비스는 생성된 링크의 수명이나 클릭 수에 제한을 두기도 한다. 따라서 중요한 문서나 영구적인 참조가 필요한 경우에는 원본 URL을 사용하거나, 신뢰할 수 있는 단축 서비스를 선택하는 것이 바람직하다.
HTTPS는 HTTP의 보안 버전으로, SSL/TLS 프로토콜을 사용하여 클라이언트와 서버 간의 통신을 암호화한다. 이는 데이터의 기밀성과 무결성을 보장하며, 중간자 공격으로부터 사용자를 보호하는 데 핵심적인 역할을 한다. 브라우저는 주소창에 자물쇠 아이콘을 표시하여 HTTPS 연결 상태를 시각적으로 알려준다. 현대 웹에서는 보안과 개인정보 보호를 위해 HTTPS 사용이 사실상 표준이 되었다.
피싱 공격자는 종종 합법적인 사이트를 흉내 낸 가짜 사이트로 사용자를 유도하기 위해 URL을 조작한다. 이는 도메인 스푸핑 기법을 사용하여, 예를 들어 'rn'을 'm'으로 보이게 하거나(Cyrillic 문자 사용), 유사한 철자의 서브도메인을 생성하는 방식으로 이루어진다. 사용자는 링크를 클릭하기 전에 주소창의 도메인 이름을 주의 깊게 확인해야 하며, 의심스러운 이메일이나 메시지의 링크는 신중하게 접근해야 한다.
공격 유형 | 설명 | 예시 (주의: 실제 클릭 금지) |
|---|---|---|
도메인 스푸핑 | 비슷하게 보이는 문자를 사용한 가짜 도메인 |
|
서브도메인 오용 | 합법적인 도메인 이름을 서브도메인 부분에 포함시킴 |
|
URL 숨김 | 링크 텍스트와 실제 href 속성의 URL을 다르게 설정 |
|
또한, URL에 포함된 민감한 정보(예: 세션 토큰, 개인 식별 정보)는 브라우저 기록, 서버 로그, 레퍼러 헤더에 노출될 수 있어 지속적인 관리가 필요하다. 개발자는 POST 메서드를 사용하거나 적절한 인증 방식을 도입하여 URL에 중요한 데이터가 노출되는 것을 방지해야 한다.
HTTPS는 HTTP의 보안 버전으로, SSL 또는 TLS 프로토콜을 통해 데이터 통신을 암호화한다. 이는 클라이언트와 서버 사이에 전송되는 모든 데이터(예: 로그인 정보, 결제 정보, 개인 메시지)가 제3자에 의해 도청되거나 변조되는 것을 방지하는 것을 목표로 한다. HTTPS를 사용하는 웹사이트의 URL은 "https://" 스킴으로 시작하며, 대부분의 현대 웹 브라우저는 주소창에 자물쇠 아이콘을 표시하여 보안 연결 상태를 시각적으로 알려준다.
보안 연결의 핵심은 디지털 인증서를 통한 서버 신원 확인과 암호화 채널 구축에 있다. 사용자가 HTTPS 사이트에 접속하면, 서버는 인증 기관으로부터 발급받은 인증서를 브라우저에 제공한다. 브라우저는 이 인증서가 신뢰할 수 있는 기관에 의해 발급되었는지, 그리고 해당 인증서의 도메인 이름이 접속하려는 사이트의 도메인과 일치하는지 검증한다. 이 과정을 통해 사용자는 의도한 정당한 서버와 통신하고 있음을 확인할 수 있다.
특성 | HTTP | HTTPS |
|---|---|---|
프로토콜 | ||
기본 포트 | 80 | 443 |
데이터 암호화 | 없음 (평문 전송) | 있음 |
데이터 무결성 보호 | 없음 | 있음 (변조 감지) |
신원 확인 | 없음 | 서버 인증서를 통한 확인 |
URL 스킴 |
|
|
HTTPS의 채택은 웹 보안의 표준이 되었다. 주요 검색 엔진들은 HTTPS 사이트를 검색 결과 순위에서 약간의 가중치를 주며, 크롬과 같은 브라우저는 HTTP 사이트에 대해 "안전하지 않음" 경고를 표시한다[10]. 이로 인해 개인정보 보호, 데이터 보안, 그리고 사이트 신뢰도 향상을 위해 모든 유형의 웹사이트가 HTTPS로 전환하는 것이 강력히 권장된다.
피싱은 사이버 범죄 기법의 하나로, 합법적인 웹사이트나 서비스를 사칭하여 사용자의 개인 정보나 금융 정보를 탈취하는 행위를 말한다. 피싱 공격은 주로 이메일이나 문자 메시지를 통해 위조된 URL을 전송하는 방식으로 이루어진다. 이 URL은 사용자를 속여 악성 사이트로 유도한다.
피싱 URL은 시각적으로 합법적인 URL과 유사하게 위장하는 방법을 사용한다. 공통적인 기법으로는 호모그래프 공격[11], 서브도메인을 악용한 긴 URL 생성, 또는 일반적으로 신뢰받는 도메인 이름 뒤에 악의적인 경로를 추가하는 방법이 있다. 예를 들어, www.secure-paypal.com과 같은 도메인은 공식 PayPal 사이트(www.paypal.com)와 무관할 수 있다.
사용자는 피싱 URL로부터 자신을 보호하기 위해 몇 가지 주의 사항을 지켜야 한다. 링크를 클릭하기 전에 마우스 커서를 올려 실제 목적지 URL을 확인하는 것이 중요하다. 또한, 발신자의 이메일 주소나 메시지의 문맥을 의심하고, 특히 긴급한 조치를 요구하거나 개인 정보 입력을 유도하는 통신에 대해 주의를 기울여야 한다. 최신 웹 브라우저와 안티바이러스 소프트웨어는 종종 피싱 사이트를 차단하는 기능을 포함하고 있다.
공격 기법 | 설명 | 예시 (가상) |
|---|---|---|
도메인 스푸핑 | 비슷한 철자의 도메인 사용 |
|
서브도메인 오용 | 신뢰 도메인을 서브도메인으로 포함 |
|
URL 숨김 | 하이퍼링크 텍스트와 실제 URL을 다르게 설정 | |
퍼센트 인코딩 남용 | 퍼센트 인코딩을 사용해 도메인을 위장 |
|
의심스러운 사이트에 개인정보를 입력한 경우, 즉시 해당 계정의 비밀번호를 변경하고 필요한 경우 금융 기관에 연락해야 한다. 많은 기관과 국가는 피싱 사례를 신고할 수 있는 공식 채널을 운영하고 있다[12].
사용자가 웹 브라우저의 주소창에 URL을 입력하거나 링크를 클릭하면, 브라우저는 해당 URL을 구문 분석하여 통신에 필요한 정보를 추출한다. 이 과정에서 브라우저는 먼저 스킴 (Scheme)을 확인하여 사용할 프로토콜(예: http, https, ftp)을 결정한다. 그 후, DNS 조회를 통해 호스트명을 IP 주소로 변환하고, 지정된 포트를 통해 서버에 연결을 시도한다.
서버는 브라우저로부터 받은 HTTP 요청을 처리한다. 요청에는 URL의 경로 (Path)와 쿼리 (Query) 문자열이 포함되어 있으며, 서버는 이를 해석하여 적절한 리소스(예: HTML 파일, 이미지, 동적 스크립트)를 찾거나 생성한다. 서버는 요청된 리소스와 함께 HTTP 상태 코드를 응답으로 반환한다. 일반적인 처리 과정은 다음과 같은 단계를 거친다.
단계 | 주체 | 주요 작업 |
|---|---|---|
1. URL 입력/클릭 | 사용자 | 브라우저 주소창에 URL 입력 또는 하이퍼링크 클릭 |
2. 구문 분석 & DNS 조회 | 브라우저 | URL 구조 해석, 호스트명을 IP 주소로 변환 |
3. 네트워크 연결 수립 | 브라우저/서버 | 스킴에 맞는 프로토콜(HTTP/HTTPS)로 서버와 핸드셰이크 |
4. HTTP 요청 전송 | 브라우저 | 경로, 쿼리, 메서드(GET, POST 등), 헤더를 포함한 요청 생성 |
5. 요청 처리 & 응답 생성 | 서버 | 경로에 해당하는 리소스를 찾고, 로직 처리 후 응답 본문과 상태 코드 생성 |
6. 응답 렌더링 | 브라우저 |
브라우저는 서버로부터 받은 응답의 콘텐츠 유형에 따라 다르게 동작한다. text/html 유형의 문서는 파싱하여 DOM 트리를 구성하고, 참조된 CSS나 이미지, 스크립트 파일에 대해서는 추가적인 URL 요청을 발생시킨다. 이때 상대 URL은 현재 문서의 기본 URL을 기준으로 해석되어 완전한 절대 URL로 변환된다. 또한, 브라우저는 방문 기록을 관리하고, 캐시 정책에 따라 리소스를 저장하여 동일한 URL에 대한 반복 요청을 줄인다.