-
Notifications
You must be signed in to change notification settings - Fork 0
HTTP : 웹의 기초
HyoSang edited this page Mar 20, 2019
·
6 revisions
-
웹 콘텐츠의 원천
-
어떤 종류의 콘텐츠 소스도 리소스가 될 수 있다
- HTTP에서 데이터 타입을 구분하기 위해 사용
- MIME 타입을 사용한다 (ex : text/html, image/jpeg ..)
- Uniform Resource Identifier
- 정보 리소스를 고유하게 식별하고 위치를 지정
- URL
- Uniform Resource Locator
- 특정 서버의 한 리소스에 대한 구체적인 위치를 서술
- URN
- 콘텐츠를 이루는 한 리소스에 대해 그 리소스의 위치에 영향 받지 않는 유일무이한 이름
-
요청 명령과 응답 결과로 구성
- 서버에게 어떤 동작이 취해져야 하는지 알려주는 것
- 클라이언트에게 응답 결과를 알려주는 세자리 숫자
-
시작줄, 헤더, 본문으로 구성
- HTTP가 사용하는 전송 계층 프로토콜
- 오류 없는 데이터 전송, 순서에 맞는 전달, 조각나지 않는 데이터 스트림을 보장
- 프록시 : 클라이언트와 서버 사이에 위치한 HTTP 중개자
- 캐시 : 많이 찾는 웹페이지를 클라이언트 가까이에 보관하는 HTTP 창고
- 게이트웨이 : 다른 애플리케이션과 연결된 특별한 웹 서버
- 터널 : 단순히 HTTP 통신을 전달하기만 하는 특별한 프록시
- 스킴 : 리소스를 가져오기 위한 프로토콜
- 호스트 : 접근 하려는 리소스를 가지고 있는 인터넷상의 호스트 장비
- 포트 : 서버가 열어 놓은 네트워크 포트 (HTTP 기본 : 80)
- 사용자 이름 & 비밀번호 : 일부 프로토콜에서 필요한 정보
- 경로 : 리소스가 서버의 어디에 있는지 알려주는 정보
- 파라미터 : 프로토콜의 파라미터(?)(생소해서 추가 정보가 필요합니다...)
- 질의 : 요청 받을 리소스 형식의 범위를 좁히기 위해 사용하는 정보
- 프래그먼트 : 리소스의 특정 부분을 가리키기 위한 정보(서버에 전송되지 않고 클라이언트에서만 사용)
- URL은 기본적으로 US-ASCII 의 7비트로 나타낼 수 있는 문자만 사용해야함
- US-ASCII로 나타낼 수 없는 문자를 URL에 사용하기 위한 방법
- %문자로 시작해 나타냄
- 인바운드 : client to server
- 아웃바운드 : server to client
- 업스트림 : 메시지의 송신자
- 다운스트림 : 메시지의 수신자
- 모든 메시지는 다운스트림 방향으로 흐른다
- 요청 메시지
<메서드><요청URL><버전>
<헤더>
<엔터티 본문>
- 응답 메시지
<버전><상태 코드><사유 구절>
<헤더>
<엔터티 본문>
- 메서드 : 클라이언트 측에서 서버가 리소스에 대해 수행해주길 바라는 동작
- 요청 URL : 요청 대상이 되는 리소스를 지칭하는 완전한 URL 혹은 URL의 경로 구성요소
- 버전 : 이 메시지에서 사용중인 HTTP의 버전
- HTTP/<메이저>.<마이너> ex) HTTP/1.1
- 상태 코드 : 요청 중에 무엇이 일어났는지 설명하는 세 자리의 숫자
- 사유 구절 : 상태코드를 설명해주는 문구로 실제 동작과는 무관
- 헤더 : 요청과 응답 메시지의 추가 정보
- 엔터티 본문 : 임의의 데이터 블록으로 있을수도 없을수도 있음
- 일반 헤더 : 요청과 응답 양쪽에 나타날 수 있음, 메시지에 대한 아주 기본적인 정보를 제공
- 요청 헤더 : 요청에 대한 부가 정보를 제공 ex) referer, cookie
- 응답 헤더 : 응답에 대한 부가 정보를 제공 ex) set-cookie
- Entity 헤더 : 본문 크기와 콘텐츠 혹은 리소스 그 자체를 서술 ex) Allow, Content-Length
- 확장 헤더 : 명세에 정의되지 않은 새로운 헤더
- URL에서 호스트명을 추출
- 호스트명에 대한 IP 주소를 검색
- 포트번호를 추출
- IP 주소와 포트 번호를 이용해서 TCP 커넥션을 생성
- HTTP 요청을 보냄
- HTTP 응답을 받음
- 커넥션 종료
- IP 패킷이라 불리는 작은 조각을 이용해 데이터를 전송
- IP 패킷 내부에는 잘개 쪼개진 데이터 스트림인 세그먼트가 들어있음
- <발신지 IP 주소, 발신지 포트, 수신지 IP 주소, 수신지 포트> 네가지 값으로 커넥션을 구분하고 생성
- 연결이 완료되면 연결이 제대로 되었는지 확인하는 패킷을 서버에서 보내고 클라이언트에서 응답함
- 간단한 TCP 요청이라면 이 과정 자체가 오버헤드
- TCP는 세그먼트를 받으면 확인 응답 패킷을 송신자에게 전송
- 이 확인 응답에 대한 응답을 받지 못하면 해당 세그먼트를 수신자는 폐기
- 송신자는 보낸 세그먼트에 대한 확인 응답 패킷을 받지 못하면 해당 세그먼트를 재전송
- 응답 패킷이 작으므로, 다른 패킷에 묶어서 전송해서 네트워크를 효율적으로 이용하는 것이 편승
- 편승할 응답패킷을 기다리다가 존재 하지 않으면 별도 응답 패킷을 전송
- 이 응답패킷을 기다리는 시간이 지연 요소
- HTTP는 편승이 일어날 확률이 적음
- TCP 커넥션이 막 만들어졌을때는 속도 제한을 걸고, 시간이 지날수록 차차 제한을 해제함
- TCP 세그먼트는 플래그와 헤더를 기본적으로 포함해야 하므로 여러 작은 TCP 데이터를 하나로 합쳐서 전송하는 알고리즘
- 확인 응답 지연과 합쳐지면 더더욱 성능을 낮추는 원인
- Connection 헤더에 들어 있는 헤더 필드명은 수신자가 응답을 보낼 때 포함되어서는 안됨
- 동시에 커넥션 여러개를 이용해 병렬로 내려받음
- 반드시 항상 더 빠르지는 않음(대역폭 이슈, 성능 이슈)
- 사용자에게 더 빠르게 느껴질 수 있음
- 처리가 완료되어도 커넥션을 유지하는 방법
- HTTP/1.1 에서는 기본적으로 활성화 되어있고 연결을 끊기 위해서는 Connection:close 헤더를 포함해서 전송
- 요청을 파이프라이닝해서 전송
- POST 요청과 같은 비멱등(nonidempotent) 요청을 이 커넥션을 이용해서 보내면 안됨
- 커넥션의 입출력을 모두 끊는 방법과 한 방향만 끊는 절반 끊기 방법이 있음
- 우아하게(?) 커넥션을 끊으려면 보통 출력 커넥션을 끊고 입력 커넥션을 주기적으로 검사하면서 끊는 방법을 사용
HTTP 완벽 가이드
Learning HTTP/2
개발자가 반드시 정복해야할 객체지향과 디자인 패턴