teklog

HTTP 완벽 가이드 - 2 URL과 리소스

2024/03/07

n°51

category : HTTP


img


익숙한 내용은 간략하게 정리. 읽으면서 궁금한 부분(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문자가 아님