[Network] HTTP 프로토콜에 대하여

원알렉스·2020년 5월 18일
6

Network

목록 보기
1/3
post-thumbnail

HTTP 프로토콜

HTTP(Hypertext Transfer Protocol)는 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜 이다. 애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동한다.

  • 서버/클라이언트 모델이란?
    서비스 제공자 (service provider)과 서비스 요청자 (service requester)로 구분되는 네트워크 모델이다. 서비스 제공자의 역할을 하는 측을 서버, 서비스 요청자의 역할을 하는 측을 클라이언트라고 한다. 서버/클라이언트 모델에서 모든 자원은 서버에 집중된다. 클라이언트는 데이터 프리젠테이션 (재현) 을 위한 최소한의 자원을 가지는게 일반적이다.

  • TCP/IP 프로토콜이란?
    인터넷 프로토콜 중 가장 중요한 역할을 하는 TCP와 IP의 합성어로 인터넷 동작의 중심이 되는 통신 규약으로 데이터의 흐름 관리, 데이터의 정확성 확인 (TCP 역할), 패킷을 목적지까지 전송하는 역할 (IP 역할) 을 담당한다. IP는 데이터를 한 장소에서 다른 장소로 정확하게 옮겨주는 역할을 하며, TCP는 전체 데이터가 잘 전송될 수 있도록 데이터의 흐름을 조절하고 성공적으로 상대편 컴퓨터에 도착할 수 있도록 보장해주는 역할을 한다.

웹브라우저의 통신 과정

클라이언트에서 요청(request)를 보내면 서버는 요청을 처리해서 응답(response)한다.

  • URL 분석 및 접속
    웹 브라우저는 URL을 분석해 서버의 IP 주소와 포트(기본은 80)를 이용해 서버와 TCP/IP 연결을 요청합니다.

  • Request 헤더 전송
    브라우저에서 요청 파일명 등이 기술된 헤더를 전송합니다.

  • Request 바디 전송
    필요한 경우에, 로그인 폼에 입력한 데이터나 첨부 파일 등의 추가적인 데이터를 전송합니다.

  • Response 헤더 해석
    서버에서 헤더를 수신하고 응답 상태(404 등)를 확인하며, 바디의 Content-Type 등을 확인합니다.

  • Response 바디 해석
    바디가 있는 경우에, 서버에서 수신한 바디를 헤더에 기술된 Content-Type에 따라서, text/html인 경우에 HTML을 렌더링하고, image/jpeg인 경우에는 그림을 띄우는 등 적절히 해석합니다.

Connectless & Stateless

HTTP는 Connectless 방식으로 작동한다. 서버에 연결하고, 요청해서 응답을 받으면 연결을 끊어버린다. 기본적으로는 자원 하나에 대해서 하나의 연결을 만든다.

  • 장점: 불특정 다수를 대상으로 하는 서비스에 적합한 방식이다. 수십만명이 웹 서비스를 사용하더라도 접속유지는 최소한으로 할 수 있기 때문에, 더 많은 유저의 요청을 처리할 수 있다.

  • 단점: 연결을 끊어버리기 때문에, 클라이언트의 이전 상태를 알 수가 없다. 이러한 HTTP의 특징을 stateless라고 하는데, Connectless로 부터 파생되는 특징이라고 할 수 있다. 클라이언트의 이전 상태 정보를 알 수 없게 되면, 웹 서비스를 하는데 당장에 문제가 생긴다. 클라이언트가 과거에 로그인을 성공하더라도 로그 정보를 유지할 수가 없다. HTTP는 cookie를 이용해서 이 문제를 해결하고 있다.

URI

클라이언트 프로그램 (웹 브라우저)은 URI를 이용하여 자원의 위치를 찾는다. URI는 HTTP와는 독립된 다른 체계다. HTTP는 전송 프로토콜이고, URI는 자원의 위치를 알려주기 위한 프로토콜이다. Uniform Resource Identifiers 의 줄임로, World Wide Web 상에서 접근하고자 하는 자원의 위치를 나타내기 위해서 사용한다. 자원은 "문서", "이미지", "동영상", "프로그램", "이메일"등 모든 것이 될 수 있다.

http://www.example.co.kr/index.html
1. http : 자원에 접근하기 위해서 http 프로토콜을 사용한다.
2. www.example.co.kr, 도메인 주소 : 자원의 인터넷 상에서의 위치이다. 도메인은 ip 주소로 변환되므로, ip 주소로 서버의 위치를 찾을 수 있다.
3. index.html : 요청할 자원의 이름이다.

이렇게 "프로토콜", "위치", "자원명"으로 (인터넷 상에서) 어디에 있던지 자원에 접근할 수 있다.

Method

메서드는 요청의 종류를 서버에게 알려주기 위해서 사용한다.

  • GET : 주어진 URL에서 자원을 요청
  • POST : 주어진 URL로 자원의 생성을 요청
  • PUT : 주어진 URL로 자원의 대체를 요청
  • DELETE : 주어진 URL로 자원의 삭제를 요청
  • HEAD : 주어진 URL에서 자원의 헤더만을 요청, 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해서 사용한다.
  • OPTIONS : 주어진 URL에서 처리 가능한 메소드의 목록을 요청

HTTP Request

웹 브라우저는 웹 서버에 데이터를 "요청"하는 "클라이언트 프로그램" 이다. 요청은 서버가 인식할 수 있는 약속된 형식 (HTTP 형식)을 따라야 한다.
요청 데이터는 "HEADER""BODY"로 구성된다.

필수 요소로 요청의 제일 처음에 와야 하는 3개의 필드가 있다.

  • 요청 메서드 : GET, PUT, POST, PUSH, OPTIONS 등의 요청 방식이 온다.
  • 요청 URI : 요청하는 자원의 위치를 명시한다.
  • HTTP 프로토콜 버전 : 웹 브라우저가 사용하는 프로토콜 버전이다.

그 외의 키값

  • Host : 요청을 보내는 Host
    (예) www.google.co.kr
  • Content-Type : 요청에 바디가 있는 경우 그 파일 포맷
    (예) Content-Type: application/json
  • Cookie : 웹 브라우저에 저장된 쿠키들
  • User-Agent : 클라이언트의 정보, 이를 통해 사용하는 브라우저 감지

HTTP Response

  • 프로토콜과 응답코드 : 웹 브라우저가 사용하는 프로토콜, 서버의 응답 상태 (1xx~5xx), 응답 메시지를 보여준다
  • Set-Cookie : 웹 브라우저에게 쿠키 생성을 요청
    (예) Set-Cookie: UserID=tester; Max-Age=3600; Version=1
  • Content-Type : 응답에 바디가 있는 경우 그 포맷
    (예) Content-Type: text/html; charset=utf-8

HTTP Status Code

2xx (성공)

  • 200 (성공): 서버가 요청을 제대로 처리함
  • 201 (생성됨): 요청이 성공했으며, 새로운 리소스가 생성됨
  • 202 (허용됨): 요청을 받았으나 아직 처리하진 않음
  • 204 (컨텐츠 없음): 요청을 처리했지만, 컨텐츠를 제공하지 않음
  • 205 (컨텐츠 재설정): 요청을 처리했지만, 컨텐츠를 표시하지 않음. 그리고 문서를 재 설정할 것을 요구함
  • 206 (일부 성공): 요청의 일부만 성공적으로 처리함

4xx (요청 오류)

  • 400 (잘못된 요청): 서버가 요청의 구문을 인식하지 못함. 주로 헤더 포멧이 HTTP 규약에 맞지 않을 경우
  • 401 (권한 없음): 인증을 필요로 하는 요청, 인증 실패
  • 403 (Forbidden, 금지됨): 서버가 요청을 거부, 인가 실패
  • 404 (Not Found, 찾을 수 없음): 서버가 요청한 리소스를 찾을 수 없음
  • 405 (허용하지 않는 방법): 요청에 지정된 방법을 사용할 수 없음. 예를 들어 POST 방식으로 요청을 받는 서버에 GET 요청을 보내는 경우

5xx (서버 오류)

  • 500 (내부 서버 오류): 서버에 오류가 발생하여 요청을 수행할 수 없음

HTTPS

SSL은 전자상거래에서의 데이터 보안을 위해서 개발한 통신 레이어다. SSL은 표현계층의 프로토콜로 응용 계층 아래에 있기 때문에, 어떤 응용 계층의 데이터라도 암호화해서 보낼 수 있다.
HTTP는 기본적으로 평문 데이터 전송을 원칙으로 하기 때문에 개인의 프라이버시가 오가는 서비스들 (전자상거래, 전자메일, 사내문서)에 사용하기 힘들다. HTTPS는 SSL 레이어위에 HTTP를 통과 시키는 방식이다. 즉 평문의 HTTP 문서는 SSL 레이어를 통과하면서 암호화 돼서 목적지에 도착하고, 목적지에서는 SSL 레이어를 통과하면서 복호화 돼서 웹 브라우저에 전달된다.

간혹 HTTPS를 하나의 프로토콜로 인식하기도 하는데, HTTP와 SSL은 전혀 다른 계층의 프로토콜콜의 조합이다. HTTPS over SSL로 보는게 좀더 정확한 시각이다

HTTP와 다른점

  • HTTPS URL은 "https://" 로 시작한다. 기본 포트번호는 443이다. HTTP URL은 "http://" 로 시작한다. 기본 포트번호는 80이다.
  • HTTP는 평문 데이터를 기반으로 하기 때문에, 유저정보와 같은 민감한 정보가 인터넷 상에 그대로 노출된다. 이 정보는 수집되거나 변조될 수 있다. HTTPS는 이러한 공격을 견딜 수 있도록 설계돼 있다.
  • HTTPS는 인증서를 이용해서, 접속 사이트를 신뢰할 수 있는지 평가할 수 있다.
  • 일반적으로 HTTPS는 HTTP에 비해서 (매우 많이)느리다. 많은 양의 데이터를 처리할 경우 성능의 차이를 체감할 수 있다. 많은 웹 사이트들이 민감한 정보를 다루는 페이지 (로그인 혹은 유저정보) 페이지를 HTTPS로 전송하고, 기타 페이지는 HTTP로 전송하는 방법을 사용한다.
profile
Alex's Develog 🤔

0개의 댓글