익숙한 내용은 간략하게 정리. 읽으면서 궁금한 부분(ssl이나 wss, sse 등 여러 프로토콜)은 더 찾아보고 추가하여 작성했다.
URL의 문법
http// www.example.com / product?type=new
어떻게 / 어디에서 / 무엇을
URL에서 각 부분은 '컴포넌트’라고도 불린다.
<프로토콜>://<사용자이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>
1. 스킴
- 어떤 프로토콜을 사용하여 리소스를 가져올 지 가리킨다
- 가장 앞에 오고, 알파벳으로 표현하며 URL의 다른 부분과 : 로 구별됨
- http: 일반 URL 포맷을 지키는 Hyper text Transfer Protocol. 기본 포트값 80
- https: http와 거의 동일. 커넥션 양 끝단에서 암호화하기 위한 보안 소켓 계층Secure Sockets Layer, SSL을 사용. 기본 포트값 443
- ssl (Secure Sockets Layer):클라이언트와 서버 간의 데이터 전송을 암호화하여 보안을 강화하는 프로토콜. 초기 인터넷 보안 통신에 널리 사용되었으며, 데이터 도청, 변조 방지 등의 보안 기능을 제공. SSL은 현재 TLS(Transport Layer Security)로 대체됨
- tls (Transport Layer Security): SSL의 후속 버전으로 개발된 암호화 프로토콜. 웹 브라우저와 서버 간의 통신을 보호하기 위해 설계되었으며, 데이터의 기밀성과 무결성 보장을 목표로 한다. TLSㅈ는 인터넷 상의 다양한 애플리케이션에서 기본적인 보안 표준으로 사용되며, 기본 포트값은 SSL과 동일하게 HTTPS의 경우 443을 사용한다.
- ssh: 보안 셸 프로토콜. 원격 컴퓨터와 안전하게 통신하며, 데이터 암호화와 함께 원격 제어 및 파일 전송을 위해 사용된다. 기본 포트값은 22이며, 암호화된 통신을 제공해 네트워크를 통한 데이터 도청이나 변조를 방지한다. 사용 예) ssh user@example.com
- mailto: 이메일 주소. 이메일은 다른 스킴과는 다르게 동작하기 때문에 mailto URL은 표준과 다르게 표현된다. ex) mailto:sample@my.com
- ftp: 파일 전송 프로토콜. FTP 서버에 파일을 올리거나 내려받기 위해 사용. 일반적인 URL 포맷을 따른다.
- file: file 스킴은 주어진 호스트 기기에서 바로 접근할 수 있는 파일을 나타낸다. 호스트 생략 시 사용하고 있는 기기의 로컬 호스트가 기본값
- rtsp, rtspu: 실시간 스트리밍 프로토콜을 통해 읽을 수 있는 오디오 및 비디오와 같은 미디어 소스를 위해 사용. rtspu는 UDP 프로토콜을 사용해 리소스를 읽는다.
- wss: WebSocket 프로토콜의 보안 버전. 데이터 전송 시 SSL/TLS를 통해 암호화하여 보안을 강화. 웹 브라우저와 서버 간의 양방향 통신 채널을 안전하게 제공. 실시간 웹 애플리케이션에서 빠르고 지속적인 데이터 교환을 필요로 할 때 사용. 기본 포트값은 443
- sse: 서버로부터 클라이언트로 실시간 데이터 스트림을 보내는 단방향 통신 프로토콜. 주로 웹 애플리케이션에서 서버가 실시간으로 정보를 푸시할 때 사용. (notification 알람). HTTP를 기반으로 작동한다. 기본 포트값은 HTTP와 동일하게 80(또는 보안 연결의 경우 443)을 사용.
2. 사용자 이름, 비밀번호
- 특정 스킴은 리소스에 접근하기 위해 사용자 이름, 비밀 번호를 필요로함. ex) ftp
- 현대 웹 애플리케이션에서 비암호화 프로토콜 사용 시 보안 상의 문제가 생길 수 있어 HTTPS를 통해 OAuth, JWT 등 더 안전한 인증 방법을 사용
3. 호스트와 포트
- 호스트는 리소스를 호스팅하는 서버의 호스트 명이나 IP 주소
- 포트는 서버가 열어놓은 네트워크 포트를 가리킨다.
4. 경로 (리소스)
- 리소스가 서버의 어디에 있는지 알려준다.
- 계층적 파일 시스템 경로와 유사한 구조를 가진다.
- ‘/’ 문자를 기준으로 경로 조각으로 나뉜다.
5. 파라미터 (;)
- 추가적인 매개변수를 정의하는데 사용됨.
- ';'문자를 기준으로 구분됨.
- 현대에는 쿼리 문자열을 대신 사용
6. 쿼리 (질의) (?key=value)
- URL의 끝부분에 위치하며, ‘?’ 문자로 시작하고 '&'문자를 사용하여 여러 쿼리를 보낼 수 있다.
- 키와 값의 쌍으로 구성되어
- 리소스에 대한 추가적인 정보를 제공하거나 서버 측에서 특정 작업을 수행하기 위한 매개변수를 전함.
- ex) 검색 엔진에서 검색어를 전달하거나, 특정 페이지를 요청할 때 필터링 옵션을 지정하는 데 사용된다.
7. 프래그먼트 (#)
- URL의 마지막 부분에 ‘#’ 문자 뒤에 사용
- 클라이언트 측에서만 사용되는 앵커를 지정
- 서버에 전송되지 않는다
- 브라우저가 프래그먼트에 해당하는 HTML 문서 내의 특정 위치로 스크롤한다
- 클라이언트 측에서 사용하는 ‘앵커’
단축 URL
- URL은 상대 URL과 절대 URL로 나뉨
- 웹 클라이언트는 단축 URL을 인식하고 사용함
- 상대 URL은 리소스를 간결하게 기술하는데 사용
- ex) 많은 브라우저가 URL 일부를 입력하면 나머지를 자동으로 입력해주는 '자동 확장’을 지원
상대 URL
<html>
<head><title>sample</title>
<body>
<main>
<h1>Hompage</h1>
<a href={`./gallery.html`}>go to my gallery</a>
- 상대 URL은 URL을 짧게 표시하는 방식
- 예제의 ./gallery.html은 스킴, 호스트가 기저base url과 동일하다고 추측 가능
- 상대 URL은 프래그먼트이거나 URL의 일부
- URL을 처리하는 브라우저, 애플리케이션은 상대 url과 절대 url을 변환할 수 있어야함.
- 상대 참조를 해석하기 위해, url을 컴포넌트로 분해하고하고 알고리즘에 따라 절대 경로로 변환할 수 있다. RFC2396
URL 확장
- 호스트명 확장 : 브라우저는 단순한 휴리스틱을 사용하여 입력한 호스트명을 전체 호스트명으로 확장. 주소창에 google만 입력하면 자동으로 www., .com을 붙인다.
- 히스토리 확장: 사용자가 방문했던 url을 기록하고 주소창에 앞글자들을 포함하는 완결된 형태의 url을 선택하게 한다.
안전하지 않은 문자
- URL은 여러 프로토콜에서 호환되고 리소스가 유일한 이름을 갖도록 설계됨
- 안전한 전송은 정보가 유실될 위험 없이 url이 전달된다는 의미
- 특정 프로토콜(SMTP)은 특정 문자를 제거할 수도 있는 전송 방식을 사용
- 이러한 일을 피하고자 최대한 알파벳 문자만 포함하도록 함.
- 추후 여러 문자를 포함하도록 하기 위해 안전하지 않은 문자를 안전한 문자로 인코딩할 수 있게함.
URL 문자 집합
- 초기에는 US-ASCII문자를 사용하도록 함.
- 이스케이프 문자는 US-ASCII에 금지된 문자들로 특정 문자나 데이터를 인코딩할 수 있게 하여 URL의 이동성과 완성도를 높임.
인코딩 체계
- 인코딩은 안전하지 않은 문자를 (%)로 시작해 ASCII 코드로 표현되는 두개의 16진수 숫자로 이루어진 이스케이프 문자로 전환
- ex) ~ => 126 (0x7E) => /sample%7Epath
- 공백 -> 32(0x20) => /sample%20path
- % => 37(0x25) => /sample%25path
문자 제한
위에서처럼 몇몇 문자는 인코딩을 위해 특별한 사용이 예약되어있다. 본래 목적이 아닌 다른 목적으로 사용 시 인코딩이 필요한 문자들은 다음과 같다.
- % 인코딩 문자를 표현하기 위해 토큰으로 사용
- / 경로를 나누기 위해 사용
- . 경로 컴포넌트에서 사용
- … 경로 컴포넌트에서 사용
- # 프래그먼트를 나타네기 위해 사용
- ? 쿼리를 나태내기 위해 사용
- ; 파라미터에 사용
- : 스킴, 사용자 이름과 비밀번호. 호스트:포트 구획문자로 사용
- @&= 특정 스킴, 쿼리 등에서 사용됨
- {} | \ [] 게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 사용하여 제한됨
- < > " 안전하지 않음. URL 범위 밖에서 역할이 있는 문자여서 인코딩 필요 ex) ‘http://sample.com’
- 0x00-0x1F, 0x7F 제한됨. 이 16진수 범위 내 문자들은 인쇄되지 않는 US-ASCII 문자
- 0x7F 이 범위의 문자들은 7비트 USC-ASCII문자가 아님