이번 시간에는 "HTTP는 무엇일까요?"에 대해 다뤄보겠습니다.
HTTP란 HyperText Transfer Protocol의 약자로, 글자 그대로 직역해보려고 한다.
나무위키를 찾아보면 HyperText는 "기존의 책과 같은 선형적인 텍스트가 아니라, 월드 와이드 웹(WWW)에서 사용되는 하이퍼링크와 하이퍼텍스트를 통해서 이어지는 비선형적인 텍스트가 신개념이라는 의미에서 만들어진 용어이다. 굳이 번역하자면, 초월문서라고 할 수 있겠다."라고 적혀있다.
비선형적인텍스트? 초월문서? 다소 생소하고 낮선 용어로 이루어져 있다.
우리는 글을 읽을때 책의 목차를 보고 '순차적'으로 원하는 내용을 찾는다.
그렇다면 아래 링크를 클릭해보자.
>>여기<<
위 링크를 눌러보면 알겠지만 하이퍼텍스트는 책과 다르게 원하는 정보에 '비순차적', '비선형적'으로 접근할 수 있다. 즉, 하이퍼텍스트는 컴퓨터화면이나 전자기기에서 볼 수 있는 텍스트(데이터)이며, 다른 텍스트와 연결될 수 있는 주소를 참조하고 있다. 여기에 덧붙여서 Transfer는 전송이고, Protocol은 통신규약의 의미를 갖는다.
이를 종합해보면 HTTP는
= HyperText
Transfer
Protocol
= 초월문서
를 전송
하는 통신규약
= 컴퓨터화면이나 전자기기에서 볼 수 있는 텍스트(데이터)
를 주고 받는
통신규약
= 다른텍스트와 연결될 수 있는 주소를 참조하고 화면이나 전자기기에서 볼 수 있는 텍스트(데이터)
를 주고 받는
통신규약
으로 이해할 수 있다.
그러면 이러한 통신규약은 어떻게 사용되는걸까?
사용자가 할 줄 아는 것은 주소창에 "www.naver.com"과 같은 URI를 입력하는 것이 전부이다.
이때 사용자가 브라우저 주소창에 URI를 입력하면 그 데이터를 요청하고 보여주는 것은 브라우저
이며, 데이터를 요청받아 응답해주는 것은 웹 서버
의 역할이다.
HTTP는 바로 그 브라우저(클라이언트)와 서버 간의 규칙을 의미한다. 이때 클라이언트가 웹서버로 데이터를 요청하는 것을 HTTP Request
라 하고, 웹서버가 클라이언트에게 데이터로 응답하는 것을 HTTP Response
라고 한다.
HTTP에 대해 공부하고자 여러 정보를 찾아본 사람들은 HTTP는 TCP/IP에 기반한다는 말을 들어본 적이 있을 것이다. TCP/IP는 무엇일까? 단순하게 얘기해보자면 OSI 7계층이 시스템 들의 연결이라면, TCP/IP 4계층은 웹서비스에 좀 더 집중한 모델이라고 생각하면 된다.
(TCP/IP 4계층과 OSI 7계층을 비교한 글)
각 계층에 대해 설명하자면 이렇다.
TCP/IP 4계층에 대해 알아봤으나 아직 HTTP가 TCP/IP에 기반하여 동작하는 과정은 감이 안올거라 생각한다. 이제 사용자가 URI를 입력하여 클라이언트와 서버사이에서 어떠한 일련의 과정을 거치는지 설명하고자 한다.
(HTTP Request가 이뤄지는 일련의 과정)
1. 사용자가 브라우저(클라이언트) 주소창에 URI를 입력하여 데이터를 요청하면 ISP(인터넷서비스제공업체)의 DNS 해석기로 IP주소를 반환받아 이 IP주소를 웹브라우저(클라이언트)에게 반환한다.
2. 응용계층에서 HTTP 메시지를 작성합니다.
3. 전송계층에서 HTTP 메시지를 패킷으로 분해합니다.
4. 인터넷계층에서 전송위치를 확인하고
5. 네트워크접근계층에서 네트워크를 통하여 전송합니다.
6. 그 이후는 위 과정의 역순으로 진행하여 처리한다.
(HTTP Response는 위 과정의 반대라고 생각하면 된다.)
비연결성(Connectionless)
비연결성은 클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어 버리는 성질을 말합니다. 이러한 연결 방식은 클라이언트가 요청을 보내는 경우에만 서버가 응답하는 단방향적 통신으로 서버가 클라이언트로 요청을 보낼수는 없다.
좀 더 이해를 돕기위해 설명하자면, 지금 당신이 읽고 있는 이 글은 링크를 클릭하는 순간 클라이언트와 서버가 연결을 맺고 내용을 주고받은뒤 바로 연결이 종료된다. 즉, 당신이 보고있는 이 페이지는 이미 연결이 종료된 페이지를 보고있는 것이다. 만약 새로고침을 한다면 다시 한번 클라이언트와 서버가 연결되고 연결이 끊긴 페이지를 보게될 것이다.
이러한 HTTP통신은 필요한 경우에만 서버로 접근하는 콘텐츠 위주의 데이터를 사용할 때 용이하며, 실시간으로 연결이 유지되는 Socket통신과 대조된다.
무상태(Stateless)
Connectionless로 인해 서버는 클라이언트를 식별할 수가 없는데, 이를 Stateless라고 합니다. 클라이언트의 상태를 모른다는 것은 아래 과정에서 로그인마다 새로운 인증을 거쳐야하는 번거로움이 생긴다.
[쇼핑몰에 접속 -> 로그인 -> 상품 클릭 -> 상세화면으로 이동 -> 로그인 -> 주문 -> 로그인 -> ....]
명령프롬프트에서 curl -v URI를 입력하면 HTTP의 자세한 동작과정을 알 수 있다. 우리가 자주 사용하는 "www.naver.com"라는 URI주소를 활용하여 HTTP메시지에 대해 공부해보자.
HTTP메시지에서 HTTP Request와 HTTP Response의 구조는 서로 닮았으며, 그 구조는 다음과 같다.
HTTP메시지 = 헤드(head) [시작줄(start-line) + HTTP헤더] + 빈줄(blank line) + 본문(body) [HTTP메시지의 페이로드]
- HTTP Request
- 시작줄(start-line): GET / HTTP/1.1
(HTTP메소드/ 요청타겟(주로 URI)/HTTP버전)
두번째로 오는 요청 타겟은 주로 URL, 또는 프로토콜, 포트, 도메인의 절대 경로로 나타낼 수도 있으며 이들은 요청 컨텍스트에 의해 특정지어 집니다. 요청 타겟 포맷은 HTTP 메소드에 따라 달라집니다. 포맷에는 다음과 같은 것들이 있습니다.
1.origin 형식
: 끝에 '?'와 쿼리 문자열이 붙는 절대 경로입니다. 이는 가장 일반적인 형식이며, GET, POST, HEAD, OPTIONS 메서드와 함께 사용합니다.
POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
2.absolute 형식
: 완전한 URL 형식입니다. 프록시에 연결하는 경우 대부분 GET과 함께 사용됩니다.
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
3.authority 형식
: 도메인 이름 및 옵션 포트(':'가 앞에 붙습니다)로 이루어진 URL의 authority component 입니다. HTTP 터널을 구축하는 경우에만 CONNECT와 함께 사용할 수 있습니다.
CONNECT developer.mozilla.org:80 HTTP/1.1
4.asterisk 형식
: OPTIONS와 함께 별표('*') 하나로 간단하게 서버 전체를 나타냅니다.
OPTIONS * HTTP/1.1- HTTP헤더:
요청에 들어가는 HTTP 헤더는 HTTP 헤더의 기본 구조를 따릅니다. 대소문자 구분없는 문자열 다음에 콜론(':')이 붙으며, 그 뒤에 오는 값은 헤더에 따라 달라집니다. 헤더는 값까지 포함해 한 줄로 구성되지만 꽤 길어질 수 있습니다. 다양한 종류의 요청 헤더가 있는데, 이들은 다음과 같이 몇몇 그룹으로 나눌 수 있습니다.Host: www.naver.com User-Agent: curl/7.55.1 Accept: */*
1.General 헤더
: Via와 같은 헤더는 메시지 전체에 적용됩니다.
2.Request 헤더
: User-Agent, Accept-Type와 같은 헤더는 요청의 내용을 좀 더 구체화 시키고(Accept-Language), 컨텍스를 제공하기도 하며(Referer), 조건에 따른 제약 사항을 가하기도 하면서(If-None) 요청 내용을 수정합니다.
3.Entity 헤더
: Content-Length와 같은 헤더는 요청 본문에 적용됩니다. 당연히 요청 내에 본문이 없는 경우 entity 헤더는 전송되지 않습니다.
- 빈줄
요청에 대한 모든 메타 정보가 전송되었음을 알림- 본문
본문은 요청의 마지막 부분에 들어갑니다. 모든 요청에 본문이 들어가지는 않습니다. GET, HEAD, DELETE , OPTIONS처럼 리소스를 가져오는 요청은 보통 본문이 필요가 없습니다. 일부 요청은 업데이트를 하기 위해 서버에 데이터를 전송합니다. 보통 (HTML 폼 데이터를 포함하는) POST 요청일 경우에 그렇습니다. 본문은 두가지 종류로 나뉩니다.
단일-리소스 본문(single-resource bodies)
: 헤더 두 개(Content-Type와 Content-Length)로 정의된 단일 파일로 구성됩니다.다중-리소스 본문(multiple-resource bodies)
: 멀티파트 본문으로 구성되는 다중 리소스 본문에서는 파트마다 다른 정보를 지니게 됩니다. 보통 HTML 폼과 관련이 있습니다.
- HTTP Response
- 시작줄(status-line): HTTP/1.1 302 Moved Temporarily
(프로토콜버전(보통 HTTP/1.1)/ 상태코드 상태텍스트)
상태코드
: 요청의 성공 여부를 나타냅니다. 200, 404 혹은 302입니다.상태텍스트
: 짧고 간결하게 상태 코드에 대한 설명을 글로 나타내어 사람들이 HTTP 메시지를 이해할 때 도움이 됩니다.- HTTP헤더:
응답에 들어가는 HTTP 헤더는 다른 헤더와 동일한 구조를 따릅니다. 대소문자를 구분하지 않는 문자열 다음에 콜론(':')이 오며, 그 뒤에 오는 값은 구조가 헤더에 따라 달라집니다. 헤더는 값을 포함해 전체를 한 줄로 표시합니다. 다양한 종류의 응답 헤더가 있는데, 이들은 다음과 같이 몇몇 그룹으로 나눌 수 있습니다.HTTP/1.1 302 Moved Temporarily Server: NWS Date: Tue, 02 Feb 2021 03:34:17 GMT Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive Location: https://www.naver.com/ Vary: Accept-Encoding,User-Agent
1.General 헤더
: Via와 같은 헤더는 메시지 전체에 적용됩니다.
2.Response 헤더
: Vary와 Accept-Ranges와 같은 헤더는 상태 줄에 미처 들어가지 못했던 서버에 대한 추가 정보를 제공합니다.
3.Entity 헤더
: Content-Length와 같은 헤더는 요청 본문에 적용됩니다. 당연히 요청 내에 본문이 없는 경우 entity 헤더는 전송되지 않습니다.
- 빈줄
요청에 대한 모든 메타 정보가 전송되었음을 알림- 본문
본문은 응답의 마지막 부분에 들어갑니다. 모든 응답에 본문이 들어가지는 않습니다. 201, 204과 같은 상태 코드를 가진 응답에는 보통 본문이 없습니다. 본문은 세가지 종류로 나뉩니다.
1.이미 길이가 알려진 단일 파일로 구성된 단일-리소스 본문
: 헤더 두개(Content-Type와 Content-Length)로 정의 합니다.
2.길이를 모르는 단일 파일로 구성된 단일-리소스 본문
: Transfer-Encoding가 chunked로 설정되어 있으며, 파일은 청크로 나뉘어 인코딩 되어 있습니다.
3.서로 다른 정보를 담고 있는 멀티파트로 이루어진 다중 리소스 본문
: 이 경우는 상대적으로 위의 두 경우에 비해 보기 힘듭니다.
HTTP메소드는 서버가 수행해야 할 동작을 나타낸다.
웹 서비스를 개발하면서 자주 접하게 되는 응답코드를 모아보았다.
우리는 오늘 HTTP에 대해 공부하였다. 그런데 사실 주소창을 사용해본 사용자라면 HTTP보다는 HTTPS가 좀 더 익숙할 것이다.
HTTPS는 HyperText Transfer Protocol Secure의 약자로 HTTP의 확장 버전이다. ‘Secure’이란 말에서 유추할 수 있듯 HTTP를 통한 데이터의 보안을 위한 조치가 추가되었고, 이때 사용되는 것이 SSL(Secure Sockets Layer)프로토콜이다. HTTP와 HTTPS의 차이점은 SSL을 사용해 데이터를 한쪽에서 다른 한 쪽으로 안전하게 보낼 수 있는지 여부이다.
위 그림에서 확인할 수 있듯, HTTP를 통해 주고받는 데이터는 평문(plain text)으로 되어있어서 중간에서 데이터를 탈취하는 누구라도 쉽게 알아볼 수 있다.
반면 HTTPS는 웹서버와 브라우저간 데이터를 암호화된 상태(encrypted text)로 주고받기 때문에 비밀번호 등 민감한 정보들이 탈취되어 악용되는 것을 방지하고, 누군가 끼어들어 데이터를 가져가도 쓸 도리가 없다.
크롬브라우저는 사용자가 HTTPS가 아닌 HTTP로 접속하면 '안전하지 않음'이라는 문구로 사용자에게 경고메시지를 노출하고 있다.
참고자료