250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 점근적 표기법
- 연결리스트
- posix
- MSA
- 자료구조
- Kruskal
- AVL트리
- 멀티프로세서
- JPA
- jpa n+1 문제
- 운영체제
- 엔티티 그래프
- 백준 장학금
- heapq
- 강화학습
- 힙트리
- 백준장학금
- python
- HTTP
- 연결리스트 종류
- 이분탐색이란
- 프로세스
- 최소힙
- spring
- SpringSecurity
- 스케줄링
- 최대 힙
- 알고리즘
- 완전이진트리
- JVM
Archives
- Today
- Total
KKanging
[http 완벽 가이드] 2장 URL과 리소스 본문

이 내용은 http 완변 가이드란 책을 읽고 정리한 내용입니다.
더 자세한 내용이 궁금하시면 책을 직접 읽어보시는 걸 추천합니다.
2장 URL과 리소스
학습목표
- URL 문법, 여러 URL 컴포넌트가 어떤 의미를 가지며 무엇을 수행하는지
- 여러 웹 클라이언트가 지원하는 상대 URL과 확장 URL 같은 단축 URL 에 대해서.
- URL의 인코딩과 문자 규칙.
- 여러 인터넷 정보 시스템에 적용되는 공통 URL 스킴.
- 기존 이름은 유지하면서 객체들을 다른 장소로 옮기는 것을 가능하게 해주는 URN을 포함한URL의미
1. 인터넷의 리소스 탐색하기
리소스를 찾기위해
- 사용자가 리소스를 가지기 위해 리소스의 위치를 알아야한다.
- URL이 리소스의 위치를 나타낸다.
- URL을 통해 리소스를 찾기위해 HTTP와 다른 프로토콜을 이용한다.
- 사용자 URL 입력 → 브라우저 적절한 프로토콜로 URL 서버에 메서드를 보냄
URL이란
- 통합 자원 지시자로( Unuform Resource Locaters)라는 이름을 가진다.
- URI의 부분 집합으로써 다음으로 나뉘어 진다.
- URL - 리소스의 위치를 나타내고 위치로 리소스를 가져온다.
- URN - 리소스의 특정 이름을 통해 리소스를 지정한다.
- URL의 형태
http://www.naver.com/index.html
→ 스킴 // 호스트(어디에)/ 경로 (무엇을 의 형태로 나타난다.
- URL은 모든 사람이 같은 방식으로 이름을 써서 리소스를 찾을 수 있도록, 단일 방식의 작명 규칙을 가진다.
2. URL 문법
- URL로 인터넷상의 모든 리소스를 찾을 수 있지만, 그 리소스들은 다른 스킴(HTTP,FTP,SMTP)을 통해 접근할 수 있으며,URL 문법은 스킴에 따라서 달라진다.
- 그렇다면 스킴이 다르다면 완전 다른 URL 문법일까? → 그건 아니다.
- 기본적인 형태는 URL 문법을 따른다.
- 대부분의 URL 스킴의 문법은 일반적으로 9개 부분으로 나뉜다.
<스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>
컴포넌트 | 설명 | 기본값 |
---|---|---|
스킴 | 리소스를 가져오려면 어떤 프로토콜을 사용하여 서버에 접근해야 하는지 가리킨다. | 없음 |
사용자이름 | 몇몇 스킴은 리소스에 접근을 하기 위해 사용자 이름을 필요로 한다. | anonymous |
비밀번호 | 사용자의 비밀번호를 가리키며, 사용자 이름에 콜론으로 이어서 기술한다. | <이메일 주소> |
호스트 | 리소스를 호스팅하는 서버의 호스트 명이나 IP주소. | 없음 |
포트 | 리소스를 호스팅하는 서버가 열어놓는 포트번호. 많은 스킴이 기본 포트를 사지고 있다(HTTP의 기본 포트는 80이다) | 스킴에 따라 다름 |
경로 | 이전 컴포넌트와 빗금(/)으로 구분되어 있으며, 서버 내 리소스가 서버 어디에 있는지를 가리킨다. 경로 컴포넌트의 문법은 서버와 스킴에 따라 다르다. | 없음 |
파라미터 | 특정 스킴들에서 입력 파라미터를 기술하는 용도로 사용한다. 파라미터는 이름/값을 쌍으로 가진다. 파라미터는, 다른 파라미터나 경로의 일부와 세미콜론(;)으로 구분하여 기술하며, 여러 개를 가질 수 있다. | 없음 |
질의 | 스킴에서 애플리케이션(데이터 베이스, 게시판, 검색 엔진, 기타 인터넷 게이트웨이)에 파라미터를 전달하는데 쓰인다. 질의 컴포넌트를 작성하는데 쓰이는 공통 포맷은 없다. 이는 URL 의 끝에 ? 로 구분한다. | 없음 |
프래그먼트 | 리소스의 조각이나 일부분을 가리키는 이름이다. URL이 특정 객체를 가리킬 경유에 프래그먼트 필드는 서버에 전달되지 않는다. 이는 클라이언트에서만 사용한다. URL 의 끝에서 #문자로 구분하다. | 없음 |
2.1 스킴 : 사용할 프로토콜
- 리소스에 접근할 때 어떻게 접근하는지 알려준는 중요한 정보다.
- 스킴 컴포넌트는 알파벳으로 시작해야 하고 URL의 나머지 부분들과 첫 번째 “:”로 구분한다.
- 스킴명은 대소문자를 가리지 않는다.
HTTP://www.naver.com/index.html == http://www.naver.com/index.html
2.2 호스트와 포트
- 애플리캐이션이 인터넷에 있는 리소스를 찾으려면, 리소스를 호스팅하고 있는 장비와 그 장비 내에서 리소스에 접근할 수 있는 서버가 어디에 있는지 알아야 한다.
- URL의 호스트와 포트가 그 정보를 제공한다.
- 호스트 컴포넌트는 접근하려고 하는 리소스를 가지고 있는 인터넷상의 호스트 장비를 가리킨다.
- DNS로 호스팅 서버의 IP주소를 가시성 있게 바꿔준다
www.naver.com == 102.34.21.3.1 이랑 같음
- 포트 컴포넌트는 서버가 열어놓은 네트워크 포트를 가리킨다. 내부적으로 TCP 프로토콜을 사용하는 HTTP는 기본 포트로 80을 사용한다.
2.3 사용자 이름과 비밀번호
→ FTP는 URL 입력시 사용자의 이름과 비밀번호를 요구하기에 여기에 적합한 예시이다.
- FTP처럼 사용자의 이름과 비밀번호를 요구하는 스킴을 사용할 시 사용자의 이름과 비밀번호를 입력안할시 기본값이 입력된다.
- 사용자의 이름은 anonymous이고
- 비밀번호는 브라우저마다 다르다.
2.4 경로
- URL의 경로 컴포넌트는 리소스가 서버의 어디에 있는지 알려준다. 해당 경로는 아래 예와 같이
계층적 파일 시스템 경로와 유사한 구조를 가진다.
http://www.joes-hardware.com:80/seasonal/index-fall.html
- HTTP URL 에서 경로 컴포넌트는 / 문자를 기준으로 경로 조각으로 나뉜다.
- 각 경로조각은 자체만의 파라미터 컴포넌트를 가질 수 있다.
2.5 파라미터
- 많은 스킴이 객체에 대한 호스트 및 경로 정보만으로는 리소스를 찾지 못한다.
- 포트, 이름과 비번 명시 외에도 많은 프로토콜이 더 많은 정보를 요구한다.
- 파라미터는 URL을 통해 서버에 리소스 정보를 요청할때 더 명확한 요청을 하게 해준다
- 예를 들어 이미지 파일을 요청한다고 가정해보자.
- 이미지 파일을 텍스트로 받을 시 깨짐 위험이 있기에 바이너리로 받고 싶다.
- 이때 파라미터를 입력을 안할시 서버에서 어떻게 줄지 위험 부담이 크다.
- 이 컴포넌트는 이름/값 쌍의 리스트로 URL의 나머지 부분들과 ‘;’문자로 구분하여 URL에 기술한다.
httpL://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true
- HTTP는 URL에서의 경로
컴포넌트는 경로조각으로 나눌 수 있다
- 위 URL에는 hammers와 index.html이란 두 개의 경로 조각이 있다. hammers 경로조각은 false 인 sale이라는 파라미터를 가진다. index.html 경로조각은 값이 True인 graphics란 파라미터를 가진다.
2.6 질의 문자열
- 데이터베이스 같은 서비스들은 요청받을 리소스 형식의 범위를 좁히기 위해서 질문이나 질의를 받을 수 있다.
- 다음 URL은 아이템 번호 12731의 재고가 있느니 확인하기 위해서 웹 데이터베이스 게이트웨이에 질의하는데 사용한다.
http://www.joes-hardware.com/inventory-check.cgi?item=12731
- ? 뒤에 있는 값들을 질의 컴포넌트라 부른다.
- 게이트웨이를 가리키는 URL의 경로 컴포넌트와 함께 전달하고 있다.
- 게이트웨이는 다른 애플리케이션에 접근할 때 거치는 통로이다.
- 특정 문자들을 제외하고는 질의 컴포넌트 포맷에 제약사항은 없다.
- 많은 게이트웨이가 &로 나뉜 이름=값 인 쌍을 이룬다.
2.7 프래그먼트
- 본래의 리소스 형식에서 더 작게 리소스를 지칭하는 것
- #을 이용한다.
http://www.joes-hardware.com/tools.html#drills
위 문법은 tools.html의 일부인 drills를 지칭한다.
- 하지만 프래그먼트를 사용하면 drills만 서버에 요청할까?
- 아니다
- 서버에는 tools.html을 요청하고 브라우저는 tools.html안에 drills를 찾아 화면에 띄운다.
3. 단축 URL
- 웹 클라이언트는 몇몇 단축 URL을 인식하고 사용한다.
- 상대 URL은 리소스 안에 있는 리소스를 간결하게 기술한다.
- 많은 브라우저가 URL 일부분을 입력하면 나머지 부분을 자동으로 입력해주는 URL 자동 확장을 지원한다.
3.1 상대 URL
- URL 의 종류
- 절대 URL: 리소스의 모든 정보가 다 있다.
- 상대 URL : 리소스의 정보가 일부만 있다.
- 상대 URL로 리소스 접근 시 필요한 모든 정보는 기저(base)라고 하는 다른 URL을 사용한다.
http://www.joes-hardware.com/tools.html
- 이 html을 보면 상대 url인 ./hammers가 있다.
- 이 상대 경로를 기준으로 브라우저는 기저URL을 http://www.joes-hardware.com/tools.html
- 을 사용해서 호스트나 스킴같은 정보들을 얻는다.
- 상대 URL을 사용하면 리소스의 위치를 쉽게 변경 가능하다.
- 변경하더라도 새로운 기저 URL에 의해 해석 되기 때문
+브라우저가 상대URL을 절대 URL로 변경하는 과정
- 우선 기저 URL을 찾는다.
- 리소스에 명시적으로 제공 - 예 ) HTML문서 중 태그로 명시되어있다.
- 리소스를 포함하고있는 기저 URL - 바로 위 그림 예제와 같이 기저 URL을 포함하지 않는 리소스에 포함된 경우 해당 리소스의 URL을 기저URL로 쓸 수 있다면 쓴다.
- 기저 URL이 없는 경우 - 없는 경우는 보통 절대 URL만으로 이루어져 있다는 뜻이다.
- 하지만 불안전하게 깨진 URL일 수 도 있다.
- 상대 참조 해석하기
- 이제 브라우저는 기저 URL과 상대 URL을 컴포넌트 단위로 분해한다.
- → 이를 URL 분해라고 한다.
- 분해하고 나면 변환을 위해 다음 알고리즘을 사용한다.
3.2 URL 확장
- 우리가 URL을 입력할때 브라우저가 우리가 입력하던 주소를 자동으로 확장하는 경험이 있을 것이다. 그것을 URL 확장이라 한다.
- URL 확장의 종류
- 호스트 명 확장
- 히스토리 확장
- 호스트명 확장
- 호스트명 확장을 지원하는 브라우저는 단순한 휴리스틱 만을 사용해서 입력한 호스트 명을 전체 호스트명으로 확장할 수 있다.
- 예) 주소입력란 yahoo를 입력하면 www.과 .com을 붙인다.
- 어떤 브라우저는 yahoo라는 단어를 포함한 사이트를 찾지 못하면 확장을 포기하기전 몇 가지의 URL을 추가로 제시하는 방식을 사용한다.
- 하지만 호스트명 확장 기능은 프락시 같은 다른 HTTP 애플리캐이션에 문제를 발생 시킬 수 있다. 이는 6장에서 해결방법이 있다.
- 히스토리 확장
- 브라우저가 유저가 과거에 방문했던 URL을 저장해놓는 것
- URL의 앞글자만 입력해도 전체 URL을 보여준다
- 프락시를 사용할 경우 URL 자동확장 기능은 다르게 동작할 수 있다는 걸 유념하자 → 6장에서 다룬다.
4. 안전하지 않은 문자
- 모든 프로토콜이 데이터를 전송하기 위해서 서로 다른 장치를 가지고 있기 때문에 어떤 인터넷 프로토콜이든 안전하게 전송될 수 있도록 URL을 설계하는 것은 중요했다.
- 안전한 전송이란 정보가 유실될 위헙 없이 URL을 전송할 수 있다는 것을 의미한다.
- URL은 상대적으로 작고 일반적으로 안전한 알파벳 문자만 포함하도록 허락한다.
- 모든 프로토콜이 사용 가능하고 가독성도 있기를 바랬다.
- → 출력이 되지 않거나 보이지 않는 문자를 URL에서 사용하는 것을 금지 했다.
- 만약 이진 데이터나 일반적으로 안전한 알파벳 외의 문자도 포함하려고 할 때가 있다
- → 이스케이프 기능을 추가하여 안전하지 않은 문자를 인코딩할 수 있게 함
4.1 URL 문자 집합
- URL 문자들은 US-ASCII 문자를 사용한다.
- 하지만 US-ASCII는 아주 적은 수의 문자만을 포함한다.
- URL 설계자들은 이스케이프 문자열을 쓸 수 있게 설계해서 US-ASCII에서 금지하는 문자를 표현할 수 있게 하였다.
4.2 인코딩 쳬계
- URL에서 안전하지 않은 문자는 16진수로 변환후 % 이스케이프 문을 사용하여 %16진수 이렇게 표현한다.
4.3 문자 제한
- 다음은 안전한 문자 안에 속해있지만 예악어라 반드시 인코딩이 필요한 문자들이다.
4.4 좀 더 알아보기
- 근데 어떤 경우는 안전하지 않은 문자를 포함해도 URL 접속이 가능한 경우가 있다.
- 이는 몇몇 프로토콜은 별 문제가 되지 않기 때문이다.
- 하지만 이는 명백한 개발자의 실수이고
- 안전하니 않은 문자를 사용하는건 하지말아야한다.
- 이를 해결하기 가장 좋은건 모든 문자를 인코딩하는 건데 그건 비추천한다.
5. 스킴의 바다
- 유명한 스킴의 예들과 형식
6. 미래
- URL은 강력한 도구이나 가장 큰 단점이 존재한다.
- URL은 리소스의 주소를 나타낼뿐 리소스의 실제 이름은 아니다.
- 이는 리소스의 위치가 달라지면 기존 URL로는 찾을 방법이 없다는 것을 의미한다.
- 이에 인터넷 기술 테스크 포스(IEFT)는 URN이란 새로운 표준 작업에 착수하였다.
- URN은 항상 객체를 가리킬 수 있는 이름을 제공한다.
- 또 지속 통합 자원 지시자 (Persistent uniform resource locators, PURL)을 사용하면 URL에서 URN 기능을 제공할 수 있다.
- PURL은 리소스의 실제 주소를 관리하고 추적하는 리소스 위치 중개 서버를 두고, 해당 리소스를 우회적으로 제공한다.
- 클라이언트는 영구적인 URL을 요청하면 PURL은 그 URL에 맞는 리소스의 실제 URL로 연결해준다.
하지만
- URN이 좋은 방식이라곤 하나 아직 URL에서 URN로 바뀌기에는 많은 시간이 필요할 것이다.
- 실제로 web 시장은 URL 단점을 그렇게 중요하지 않게 보기 때문에 바뀌는데 오래걸릴 것이고
- URL을 대체할 것이 생기기 전까지 널리 쓰일것이다.
'cs > http' 카테고리의 다른 글
[http 완벽 가이드] 6장 프락시 (0) | 2023.08.13 |
---|---|
[http 완벽 가이드] 5장 웹 서버 (0) | 2023.08.06 |
[http 완벽 가이드] 4장 커넥션 관리 (0) | 2023.07.28 |
[http 완벽 가이드] 3장 HTTP 메시지 (0) | 2023.07.28 |
[http 완벽 가이드] 1장 HTTP 개관 (0) | 2023.07.28 |