HTTP란?
•
HTTP는 Hyper Text Transfer Protocol
•
인터넷에서 HTML문서와 같은 리소스를 주고받을 수 있는 프로토콜
◦
모든 데이터 교환의 기초
◦
클라이언트 - 서버 프로토콜
•
규칙에 맞춰 개발하기 때문에 정보를 교환할 수 있다
•
확장 가능한 프로토콜
•
TCP 또는 TLS(암호화된 TCP 연결)을 통해 전송
HTTP의 특징
간단함
•
HTTP는 사람이 읽을 수 있게 고안되었다
•
HTTP/2는 HTTP 메세지를 프레임 별로 캡슐화 → 간결함을 유지
확장 가능
•
HTTP 헤더를 통해 확장하고 실험하기 쉽다
→ 헤더를 통해 부가적인 정보를 전송할 수 있다
•
헤더의 시맨틱에 대해 클라이언트 - 서버 사이에 합의가 된다면, 새로운 기능을 추가할 수 있다
◦
시맨틱 태그 : 이름만 봐도 해당 태그의 역할을 알 수 있다
(윗부분 생략)
<header>
(헤더 관련 코드 생략)
</header>
<main>
(본문 관련 코드 생략)
</main>
<footer>
(푸터 관련 코드 생략)
</footer>
Java
복사
Stateless하지만 세션이 있다
•
HTTP는 상태를 저장하지 않는다(Stateless)
•
사용자와 페이지가 상호작용 하길 원하는 경우 HTTP 쿠키를 사용해 세션을 만든다
•
HTTP 헤더에 Set-Cookie 헤더를 통해 쿠키를 생성할 수 있다
TCP 표준에 의존한 연결
•
HTTP는 근본적인 전송 프로토콜을 요구하지 않는다
•
신뢰할 수 있고 메세지 손실이 없는 연결을 요구
→ TCP 표준에 맞춰 연결
HTTP를 통해 제어할 수 있는 것
1. 캐시
•
HTTP를 통해 문서가 캐시되는 방식을 제어할 수 있다
•
서버는 캐시 대상과 기간을 프록시와 클라이언트에 지시할 수 있다
2. 인증
•
페이지를 특정 사용자만이 접근할 수 있도록 설정 가능
3. 프록시와 터널링
•
서버 / 클라이언트는 인트라넷에 위치해 실제 주소를 숨기기도 한다
•
HTTP 요청은 네트워크 장벽을 무시하고 프록시를 통해 나간다
4. 세션
•
HTTP 쿠키를 통해 서버의 상태와 요청을 연결한다
HTTP 흐름
1. TCP 연결
•
TCP 연결은 요청을 보내거나 응답을 받는데 사용
•
클라이언트는 새 연결을 열거나, 기존 연결을 재사용하거나, 서버에 대한 여러 TCP 연결을 열 수 있다
2. HTTP 메시지를 전송
•
HTTP 메시지는 사람이 읽을 수 있다.
•
HTTP/2에서는 메시지가 프레임 속으로 캡슐화되어 직접 읽는게 불가능하지만 원칙은 동일
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
Java
복사
3. 서버에 의해 전송된 응답을 읽음
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
Java
복사
4. 연결을 닫음 / 다른 요청을 위해 재사용
HTTP 메세지
•
HTTP 메세지는 사람이 읽을 수 있다
•
요청과 응답 (Request and Response) 두 가지 타입이 있다
요청(Request)
•
HTTP 메서드
◦
클라이언트가 수행하고자 하는 동작 : GET, POST
•
Path
◦
가져오려는 리소스의 경로
◦
프로토콜, 도메인, TCP 포트를 제거안 리소스의 URL
◦
위 사진에서는 developer.mozilla.org의 도메인
•
HTTP 프로토콜 버전
•
서버의 추가 정보를 전달하는 헤더
응답(Response)
•
HTTP 프로토콜의 버전
•
요청의 성공 여부를 보여주는 상태 코드
•
상태 코드의 짧은 설명을 나타내는 상태 메시지
•
요청 헤더와 비슷한 HTTP 헤더
•
선택 사항으로 가져온 리소스가 포함되는 본문
요약
HTTP란 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다. 요청과 응답 HTTP 메세지를 갖고있으며 각 메세지를 통해 요청과 응답에 대한 정보를 쉽게 이해할 수 있다. 또한 HTTP 헤더 덕분에 확장성이 높고 사용과 이해가 쉽다.