Computer Network — 3. HTTP

이 글은 2018년 2학기 아주대학교 Paul Rajib 교수님의 Computer Network 수업을 듣고 작성한 수업노트입니다. 부족한 내용이나 오류가 있을 수 있습니다.

HTTP(Hyper-Text Transfer Protocol)

HTTP는 웹사이트에서 웹 페이지를 보기 위해서 만들어진 프로토콜이다. 단순히 웹페이지를 보는 것 외에도 다른 여러 기능들을 제공한다. 오늘날에는 웹 사이트 외에도 다양한 목적으로 사용되고있다. 대표적으로 REST API가 있다.

HTTP는 Client-Server 구조의 프로토콜이다. 웹 브라우저같은 클라이언트가 웹 페이지를 보기위해 웹 서버에 요청(HTTP Request)을 보내면 서버는 그 요청을 해석하고 해당하는 웹 페이지를 돌려준다. 이 돌려주는 데이터를 응답(HTTP Response)라고 한다. HTTP는 클라이언트와 서버가 요청과 응답을 반복하는 방식의 프로토콜이다.

HTTP는 80번 포트를 사하고 TCP와 UDP를 모두 지원한다. HTTP의 TCP도 Persistent Connection과 Non-persistent Connection으로 나뉜다. TCP는 데이터를 주고받기 전 연결 상태를 만들고 전송할 일이 없으면 연결을 끝낸다. HTTP 서버에 요청을 보내고 응답을 받으면 바로 TCP Connection을 끝내는 방식이 Non-persistent Connection이다. 이 방식은 데이터를 주고받을 때마다 연결 상태를 만들고 해제하기 때문에 요청을 보낼 때마다 추가적인 오버헤드가 생긴다. 보통 브라우저가 웹 서핑을 할 때는 웹 페이지 말고도 이미지, CSS 등 여러 데이터를 주고받기 때문에 Persistent Connection을 사용한다.

HTTP Request & Response

HTTP 요청은 Request Line, Header Lines, Body로 나뉜다. HTTP 응답도 Status Line, Header Lines, Body로 나뉘게 된다. 요청과 응답에서 Body는 존재하지 않을 수 있다.

URL(Uniform Resource Locator)란 웹서버에 저장된 자원(Resource)을 나타내는 규약이다. HTTP는 웹 서버에 저장된 자원(웹페이지, 이미지, 비디오, 오디오 등)을 가져오거나 수정하기위해 URL을 사용한다.

Image for post
Image for post
https://blog.rankwatch.com/wp-content/uploads/2015/10/

URL은 위 사진처럼 프로토콜, 도메인(혹은 IP)주소, 가져오려는 파일의 경로(Directory, filename) 그리고 쿼리 파라미터로 이루어져있다.

HTTP 요청(Request)을 통해 클라이언트가 HTTP서버에게 특정 자원에 대한 접근이나 동작을 요구하게된다. 이를 위해 접근하려는 자원의 URL과 동작을 명시하는 메서드(Method), 부가적인 정보를 기술하는 헤더(Header), 전송할 내용물을 담은 Body로 나뉜다.

Image for post
Image for post

첫 줄이 Request Line으로 HTTP Method와 URL, HTTP Version이 명시되어있다. 이후 두번째 줄부터 HTTP Header가 명시되어있고 각 헤더와 Request Line은 띄어쓰기로 구분된다. 더이상 헤더가 없을 경우 빈 줄을 표시하고 이후에 바이너리나 텍스트로 된 바디가 들어간다. 바디는 사진등의 파일을 업로드하거나 로그인을 할 때 아이디와 비밀번호가 암호화되어 들어가는 경우에 그 내용들이 들어간다.

HTTP 1.1 에선 GET, POST, PUT, HEAD, DELETE 등의 메소드를 제공하며 각 메소드마다 역할이 정의되어있다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Methods

웹 서버가 요청을 받고나서 그 요청에대한 응답을 돌려주게된다. HTTP 응답은 응답의 상태(성공, 에러 등)을 표시하는 Status Line과 부가적인 정보를 담은 헤더, 그리고 웹 페이지나 이미지 등의 컨텐츠를 담은 바디로 나뉘어진다.

Image for post
Image for post

요청과 마찬가지로 띄어쓰기로 구분되며, 헤더가 끝난 후엔 빈 띄어쓰기가 추가된다. 이후에 웹 페이지나 이미지 등의 결과물이 담기게된다. HTTP는 Status Line에서 숫자로 요청에 대한 결과를 나타내주며 숫자에 따른 결과값들이 정의되어있다.

Image for post
Image for post
https://codeteddy.com/2017/06/06/create-api-with-asp-net-core-day-3-working-with-http-status-codes-in-asp-net-core-api/

자세한 응답 코드들은 아래에서 확인
https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

Cookie

HTTP는 기본적으로 상태없는(Stateless) 프로토콜이다. 상태가 없다는 의미는 웹 서버가 클라이언트와의 요청-응답이 끝난 후 다시 클라이언트가 요청을 해도 이전에 요청을 했던 사람인지 아닌지 기억하지 않는다는 의미이다. 따라서 웹사이트에서 로그인을 한 상태거나 장바구니에 물품들을 넣는 등의 상태를 서버가 알수있게 하려면 특별한 수단이 필요하다. 이를 위해서 사용되는게 쿠키이다.

쿠키는 클라이언트와 서버의 모든 요청마다 들어가는 특별한 값이다. 장바구니 목록을 가져야하면 쿠키에 장바구니 물품 목록이 들어가게된다. 그런데 로그인 정보를 저장해서 유저를 확인하기위해 ID와 비밀번호를 쿠키값에 넣을 경우 노출될 위험이 생긴다.

Image for post
Image for post

그래서 조금 특별한 방식을 사용한다. 위 예시처럼 클라이언트가 서버로 ID와 비밀번호를 전송해서 로그인을 한 경우 서버는 로그인 정보를 서버의 DB에 저장하고 DB에 저장된 값의 ID를 쿠키에 담아 응답을 보낸다. 그러면 앞으로 클라이언트와 서버가 통신에 쿠키값에 이 ID가 저장되며 서버는 이 ID값을 DB와 조회해서 클라이언트의 로그인여부를 알 수 있다. 또한 쿠키값이 노출되어도 이 ID값으로는 클라이언트의 원래 ID와 비밀번호는 노출되지 않는다.

Web Cache

특정 웹사이트에 접속하려는 사람이 많을 경우 네트워크 트래픽이 몰려 성능이 저하될 수 있다. 그래서 캐시서버에 접속하려는 사이트의 리소스(웹 페이지, 이미지) 등을 미리 저장해둔 뒤 요청을 분석해서 원본이 저장된 서버 대신 리소스를 제공하는 방식이다.

Image for post
Image for post

프록시 서버는(Proxy Server) 위 사진처럼 클라이언트가 서버에 요청을 대신 받아 전달하는 역할을 한다. 웹 캐시는 프록시 서버를 통해 동작하며 원본 서버(Origin Server)의 원본 웹 페이지를 갖고 있다가 원본 서버로의 요청을 받으면 대신 응답을 주게된다.

Image for post
Image for post

위 사진의 예시를 보면 인터넷을 통해 원본 서버에서 데이터를 가져오려면 1.54Mbps의 회선을 거쳐야한다. 하지만 내부 네트워크의 캐시 서버에 저장된 데이터를 가져오면 1Gbps의 회선을 사용해서 더 빠르게 데이터를 가져올 수 있다.

이러한 웹 캐시를 사용하면 응답시간을 줄이고, 트래픽도 감소시킬 수 있기 때문에 대부분의 ISP에는 이런 캐시서버가 적용되어있다.

원본이 변경되었을 경우 캐시서버에 저장된 사본 역시 바뀌어야한다. 캐시서버가 원본이 바뀌었는지 여부를 확인하기위해 사용하는 방식이 Conditional-GET이다.

Image for post
Image for post

HTTP GET 요청의 헤더에 If-modified-since 헤더를 추가해서 특정 날짜 이후로 URL의 자원이 변경되었는지 물어보게된다. 원본이 변경되지 않았을 경우 서버는 304 Not Modified를 응답하고, 그렇지 않을 경우 변경된 원본 데이터를 돌려준다.

이를 이용해 캐시 프록시 서버는 원본이 변경되지않은 경우 자신이 갖고있는 사본을 대신 돌려주게된다. 서버와 통신하는 내용도 단순히 요청과 응답만 오고가며 컨텐츠가 담겨있지 않기 때문에 더 적은 트래픽을 사용하게된다.

Written by

2020.12.8 ~ 2022.6.9 군복무중 Serving in the South Korean Military Service

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store