HTTP는 인터넷상에서 링크가 포함된 텍스트를 전송하는 프로토콜이다. 웹은 HTTP의 별칭이라고도 한다.
📌 순서
- 클라이언트-서버 아키텍처(Client-Server Architecture)
- 하이퍼텍스트(Hypertext)
- HTTP(Hypertext Transfer Protocol)
- 쿠키(Cookie)
- 프록시 서버(Web Caches 혹은 Proxy Server)
리소스가 존재하는 곳(Server)와 리소스를 사용하는 앱(Client)을 분리시킨 것을 2-Tier 아키텍처, 다른 말로 클라이언트-서버 아키텍처라고 한다. HTTP는 클라이언트-서버 아키텍처를 기반으로 한 대표적인 프로토콜이다.
언제나 열려있어야 하며, 고정된 IP주소를 가지고 있어야 한다.
서버와 상호자용을 하며, 고정된 IP주소를 가질 필요가 없다.
👉🏻 리소스가 저장된 공간(DataBase), 리소스를 전달해주는 앱(Server), 리소스를 사용하는 앱(Client)로 구분된 아키텍처이다.
👉🏻 2-Tier 아키텍처인 클라이언트-서버 아키텍처에 DB가 추가된 형태이다.
문서와 문서 간에 연결(링크)점을 가지고 있어서 관련 정보를 쉽게 찾을 수 있는 비선형 구조의 텍스트로, 사용자의 선택에 따라 검색 순서가 달라진다.
하이퍼 링크(HyperLink): 문서와 문서 간에 정보를 쉽게 검색하고 나타내기 위해 연결된 기능
인터넷 상에서 정보를 주고 받을 수 있는 프로토콜로, 주로 HTML 문서를 주고받는 데 쓰인다.
👉🏻 하위 계층인 전송(Transport) 계층에서 TCP를 사용해 동작한다.
👉🏻 높은 신뢰성을 보장하는 TCP를 사용함으로써 유실없이 서버와 통신이 가능하다.
👉🏻 요청(Request)과 응답(Response)로 이루어져있다.
👉🏻 Client와 Server 사이에 TCP Connection이 이루어져야 한다.
👉🏻 Stateless: 요청과 응답 이후에 Server 는 Client에 대한 어떠한 것도 기억하지 않는다.
Non-persistent HTTP✔️
매번 TCP Connection을 새로 맺는다. Connection control 메시지 교환이 필요하다.
Persistent HTTP✔️
한번 맺은 TCP Connection을 재사용한다.
요청을 묶어서 한꺼번에 보내면 응답시간이 줄어든다.
Sample✔️
GET /restapi/test.html HTTP/1.1 Accept: application/json, image/jpeg Accept-Language: utf-8 Accept-Encoding: gzip, deflate Authorization: Bearer UExBMDFUMDRQV1MwMnzpdvtYYNWMSJ7CL8h0zM6q6a9ntw Content-Length: 35 bookId=1234&author=Tan+Ah+Teck
HTTP 요청 메시지는 위와 같은 형태를 갖는다.
GET /restapi/test.html HTTP/1.1
첫 줄은 Start Line 혹은 Request Line이라고 부른다.
HTTP Method
+Request Target(URI)
+HTTP Version
으로 구성된다.HTTP Method✔️
HTTP Method 설명 GET 리소스 조회 POST 요청 데이터 처리, 주로 등록에 사용 PUT 리소스를 대체(덮어쓰기), 해당 리소스가 없으면 생성 PATCH 리소스 부분 변경(PUT이 전체 변경, PATCH는 일부 변경 DELETE 리소스 삭제 TRACE 루프백 메시지 호출 테스트 OPTION 웹 서버에서 지원하는 메서드 조회 CONNECT 프록시 기능 요청 그리고 그 아래 Line부터 Blank line까지를
Request Headers
라고 한다. 헤더에는 여러가지 내용이 담겨지는데, 자세한 것은 뒤에 자세히 다루도록 하겠다.Blank line 아래부터는
Request Body
부분이다.
Sample
HTTP/1.1 200 OK Date: Thu, 20 May 2004 21:12:58 GMT Connection: close Server: Apache/1.3.27 Accept-Ranges: byte Content-Type: text/html Content-Length: 170 Last-Modified: Thu, 18 May 2004 10:14:49 GMT <html> <head> <title></title> </head> <body> <p></p> </body> </html>
HTTP 응답 메시지는 위와 같은 형태를 갖는다.
HTTP/1.2 200 OK
첫 줄은 Start Line 혹은 Response Line이라고 부른다.
HTTP Version
+Status Code
+Status Text
로 구성된다.Status Code 종류
Status Code 설명 1xx (요청에 대한 정보) 요청을 받으면, 기존 작업 처리를 계속 진행한다. 2xx (성공) 작업이 성공적으로 수용되고 해석되었으며, 수행되었다. 3xx (리다이렉션) 요청 작업을 완료하기 위해 추가적인 동작을 수행해야한다. 4xx (클라이언트 오류) 클라이언트 요청에 부적절한 구문이 있거나 해당 내용이 수행될 수 없다. 5xx (서버 오류) 서버가 유효한 요청에 대한 작업을 수행하지 못했다. 그리고 그 아래 Line부터 Blank line까지를
Response Headers
라고 한다.Blank line 아래부터는
Response Body
부분이다.
General header✔️
요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더
👉🏻
Date
: 현재시간👉🏻
Pragma
: 캐시제어, HTTP/1.0에서 쓰던 것으로, HTTP/1.1에서는 Cache-Control이 쓰인다.👉🏻
Cache-Control
: 캐시를 제어할 때 사용한다.👉🏻
Upgrade
: 프로토콜 변경시 사용한다.👉🏻
Via
: 중계(프록시)서버의 이름, 버전, 호스트명👉🏻
Connection
: 네트워크 접속을 유지할지 말지 제어한다. HTTP/1.1은 keep-alive로 연결 유지하는게 default 값이다.👉🏻
Transfer-Encoding
: 사용자에게 entity를 안전하게 전송하기 위해 사용하는 인코딩 형식을 지정한다.Request header✔️
패치될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더
👉🏻
Host
: 요청하려는 서버 호스트 이름과 포트번호이다.👉🏻
User-agent
: 클라이언트 프로그램 정보이다. ex) Mozilla/4.0, Windows NT5.1👉🏻
Referer
: 현재 페이지로 연결되는 링크가 있던 이전 웹 페이지의 주소이다.👉🏻
Accept
: 클라이언트가 처리 가능한 MIME Type 종류를 나열한다.👉🏻
Accept-charset
: 클라이언트가 지원 가능한 문자열 인코딩 방식이다.👉🏻
Accept-lanquage
: 클라이언트가 지원 가능한 언어를 나열한다.👉🏻
Accept-encoding
: 클라이언트가 해석 가능한 압출 방식을 지정한다.👉🏻
If-Mofified-Since
: 여기에 쓰여진 시간 이후로 변경된 리소스를 취득한다. 캐시가 만료되었을 때에만 데이터를 전송하는데 사용한다.👉🏻
Authorization
: 인증 토큰을 서버로 보낼 때 사용한다.👉🏻
Origin
: 서버로 POST 요청을 보낼 때 요청이 어느 주소에서 시작되었는지 나타내는 값이다. 경로 정보는 포함하지 않고 서버 이름만 포함된다. 이 값으로 요청을 보낸 주소와 받는 주소가 다르면 CORS 에러가 난다.👉🏻
Cookie
: 쿠키 값 key-value로 표현한다. Set-Cookie 헤더와 함께 서버로부터 이전에 전송됐던 저장된 HTTP 쿠키를 포함한다.Response header
위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더
👉🏻
Server
: 웹 서버의 종류이다.👉🏻
Age
: max-age 시간 내에서 시간이 얼마나 흘렀는지 초 단위로 알려주는 값이다.👉🏻
Referrer-policy
: 서버 referrer 정책을 알려주는 값이다. ex) origin, no-referrer, unsafe-url👉🏻
WWW-Authenticate
: 사용자 인증이 필요한 자원을 요구할 시, 서버가 제공하는 인증 방식이다.👉🏻
Proxy-Authenticate
: 요청한 서버가 프록시 서버인 경우 유저 인증을 위한 값이다.👉🏻
Set-Cookie
: 서버 측에서 클라이언트에게 세션 쿠키 정보를 설정한다. (RFC 2965에서 규정)Entity header
콘텐츠 길이나 MTME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더
👉🏻
Content-type
: 리소스의 media type를 명시한다. ex) application/json, text/html👉🏻
Content-Length
: 바이트 단위를 가지는 개체 본문의 크기이다.👉🏻
Content-language
: 본문을 이해하는데 가장 적절한 언어이다.👉🏻
Content-location
: 반환된 데이터 개체의 실제 위치이다. ex) /index.html👉🏻
Content-disposition
: 응답 메시지를 브라우저가 어떻게 처리할지 명시한다. 주로 다운로드에 사용한다.👉🏻
Content-Security-Policy
: 다른 외부 파일을 불러오는 경우 차단할 리소스와 불러올 리소스를 명시한다.
ex) default-src https -> https 로만 파일을 가져옴
ex) default-src 'self' -> 자기 도메인에서만 가져옴
ex) default-src 'none' -> 외부파일은 가져올 수 없음👉🏻
Content-Encoding
: 본문의 리소스 압축 방식을 명시한다. 주로 Content-Type과 같이 사용되며 참조되는 미디어 타입을 얻도록 디코드하는 방법을 클라이언트가 알게 해준다.👉🏻
Location
: 301, 302 상태코드일 때만 볼 수 있는 헤더로, 서버의 응답이 다른 곳에 있다고 알려주면서 해당 위치(URL)을 지정한다.👉🏻
Allow
: 지원되는 HTTP 요청 메서드이다. ex)GET, HEAD, POST👉🏻
Expires
: 자원의 만료 일자이다.👉🏻
ETag
: 리소스의 버전을 식별하는 고유한 문자열 검사기이다. 주로 캐시 확인용으로 사용한다.
쿠키는 서버의 Stateless한 특성을 보완하기 위한 기능이다. 서버가 어떤 데이터를 브라우저 측에 저장하고, 그 데이터를 받아올 수 있도록 한다.
과정✔️
👉🏻 첫 request 후 Server가 Client 에게 보내는 response head 중 set-cookie에 쿠키 번호를 담아 보낸다.
👉🏻 그 다음부터 Client는 Server에게 보내는 request head에 cookie 번호를 담아 보낸다.
프록시 서버는 클라이언트와 서버 사이에 존재하는 Entity이다. 클라이언트가 보낸 요청에 해당하는 응답이 프록시 서버에 있다면 본 서버로 보낼 필요없이 응답하는 방식이다.
HTTP에서 더 빠른 링크 접근을 위해서는 케이블 확장 공사를 하거나, 웹 프록시 설치를 하는 방법 등이 있는데, 프록시 설치를 하는 방법이 비용대비 효율이 좋다.
👉🏻 클라이언트 입장에서 빠르게 요청에 대한 응답을 받을 수 있다.
👉🏻 서버 입장에서는 들어오는 요청이 줄기 때문에 부담이 적어진다.
👉🏻 인터넷 트래픽이 줄어들면서 회선에 사용되는 비용이 감소한다.
👉🏻 일관성의 문제가 생길 수 있다. 본 서버에 위치한 원본이 바뀐 경우 프록시에서 보관하고 있는 웹 캐시와의 차이가 발생할 수 있다.
👉🏻 웹 캐시(Proxy Server)의 일관성 문제를 해결하기 위한 방법이다.
👉🏻 요청 메시지에If-modified-since
필드를 추가해서 전송한다.
👉🏻 서버의 file이 수정된 시간과 비교하여 확인할 수 있도록 한다.