Search

HTTP

HTTP

HTTP(HyperText Transfer Protocol)는 인터넷상에서 데이터를 전송하기 위한 프로토콜로 TCP/IP 4계층에서 응용 계층에 속한다.
HTTP는 다음과 같은 특징이 있다.
비연결성(connectionless)
클라이언트에서 요청을 보낸 후 서버로부터 응답을 받으면 연결을 끊는 것을 의미한다.
비연결성은 불특정 다수를 대상으로 하는 서비스에 유리하다.
서버에서 응답을 받고 나서도 연결을 유지하려면 그만큼 자원을 사용하게 된다.
따라서 비연결성은 연결을 유지하지 않음으로써 자원을 아낄 수 있다.
하지만 연결을 유지하지 않기 때문에 서버가 클라이언트를 기억할 수 없다는 단점이 있다.
또한 동일한 클라이언트에서 연속적으로 요청이 오면 연결과 연결 해제 과정을 반복하게 되어 자원을 낭비하게 된다.
이러한 단점을 보완하기 위해 일정 시간 동안 연결을 유지할 수 있도록 HTTP Keep Alive를 사용한다.
따라서 마지막 응답 이후 일정 시간 동안 연결을 유지해 동일한 클라이언트로부터 요청이 오면 연결 과정을 생략할 수 있다.
무상태(stateless)
서버에서 클라이언트의 상태를 저장하지 않는 것을 의미한다.
따라서 클라이언트는 요청에 필요한 데이터를 모두 가지고 있어야 한다.
또는 서버가 클라이언트로부터 받은 요청 사항을 모두 저장해야 한다.
이 방법들을 각각 쿠키(cookie)와 세션(session)이라고 한다.
무상태의 장점은 서버 확장성이 높다는 점이다.
클라이언트의 요청에 응답하는 서버가 바뀌어도 되기 때문에 서버를 계속 확장해도 된다.
따라서 특정 서버에 문제가 생겨 응답하지 못하는 문제점을 보완할 수 있다.
HTTP에서는 클라이언트와 서버가 통신하기 위해 정형화된 데이터인 HTTP 메시지를 주고 받는다.
요청 라인(request line)
요청 URI, 요청 방법, HTTP 버전 등을 포함한다.
상태 또는 응답 라인(status line)
요청에 대한 HTTP 상태 코드와 HTTP 버전을 포함한다.
헤더(header)
키-값으로 구성된 다수의 헤더 항목으로 구성된다.
빈 줄(blank line)
헤더의 끝을 나타내는 빈 줄로 헤더와 바디를 구분한다.
바디(body)
요청할 때 요청 방법 메서드가 POST인 경우에만 바디가 있고 그 외 메서드일 때는 비어 있는 상태로 전달된다.

HTTPS

HTTPS(HyperText Transfer Protocol Secure)는 보안 계층인 SSL/TLS를 이용해 HTTP의 보안을 강화한 웹 통신 프로토콜이다.
HTTP는 데이터 암호화를 거치지 않고 전송해서 보안에 취약하다.
그래서 이를 보완한 HTTPS가 등장했다.
SSL(Secure Socket Layer)은 넷스케이프(Netscape)에서 개발한 암호화 프로토콜이다.
당시 SSL은 몇 가지 문제점이 있었는데 이를 보완해 새로운 암호화 프로토콜인 TLS(Transport Layer Security)를 개발했다.
현재 HTTPS에서 통용되는 방식은 TLS지만 SSL이라는 명칭이 사라지지 않아서 SSL 또는 SSL/TLS라고 부른다.
HTTPS의 동작 방식은 다음과 같다.
데이터를 송신할 때 응용 계층에서 보안 계층의 SSL/TLS로 데이터를 보내면 데이터를 암호화해 전송 계층으로 전달한다.
그러면 데이터를 수신할 때 전송 계층에서 보낸 데이터를 보안 계층의 SSL/TLS에서 받아 복호화한 후 응용 계층으로 보낸다.
대칭 키 암호화 방식과 공캐 키 암호화 방식
SSL/TLS에서는 암호화를 위해 2가지 암호화 방식을 사용한다.
대칭 키 암호화 방식
데이터의 암호화와 복호화에 모두 같은 키인 대칭 키를 이용하는 방식이다.
먼저 수신자가 가진 키를 송신자에게 준다.
이때 수신자가 같더라도 송신자가 다르면 이용하는 키도 다르다.
송신자는 받은 키로 데이터를 암호화한 후 수신자에게 보낸다.
수신자는 동일한 키로 데이터를 복호화한다.
이 방식을 이용할 때는 대칭 키가 유출되지 않도록 주의해야 한다.
공개 키 암호화 방식
데이터의 암호화와 복호화를 다른 키로 하는 방식이다.
데이터를 암호화할 때는 공개 키를, 데이터를 복호화할 때는 비밀 키를 이용한다.
먼저 수신자는 공개 키를 송신자에게 준다.
이때 송신자가 달라도 공개 키는 같다.
송신자는 수신자에게 받은 키로 데이터를 암호화한다.
수신자는 비밀 키로 송신자에게 받은 데이터를 복호화한다.
이 방식은 비밀 키가 있어야만 데이터를 복호화할 수 있어서 공개 키 유출을 염려하지 않아도 된다.

웹 페이지 접속 과정

1.
사용자가 URL을 웹 브라우저에 입력한다.
2.
웹 브라우저는 입력한 URL을 바탕으로 Local DNS 서버(ISP)에 연결할 IP를 요청한다.
3.
Local DNS 서버는 Root DNS 서버에게 IP 주소를 요청하고 Root DNS 서버는 .com DNS 서버의 IP 주소를 반환해주고 다시 .com DNS 서버로 IP 주소를 요청하면 google.com 도메인의 DNS 서버의 IP 주소를 반환한다. 마지막으로 google.com 도메인의 DNS 서버에 IP 주소를 요청하면 웹 브라우저에게 응답으로 제공한다.
4.
웹 브라우저는 DNS 서버에서 받은 IP를 통해 웹 서버와 3-way 핸드셰이크를 거쳐 TCP/IP 연결을 하고 HTTP 요청을 보낸다.
5.
웹 서버는 받은 HTTP 요청에 응답한다. 응답은 웹 페이지와 필요한 리소스를 포함한다.
6.
웹 브라우저는 받은 응답을 바탕으로 사용자에게 웹 페이지를 보여준다.