HTTP

Feb 13, 2019


1. HTTP (HyperText Transfer Protocol)

인터넷 상에서 데이터를 주고받기 위한 프로토콜

  • 데이터는 오디오/비디오/이미지/텍스트 등 종류를 가리지 않는다. (본질은 같다.)
  • 때문에 모두 HTTP를 이용해 전달하고 받을 수도 있다.
  • 이 때, TCP/IP 4계층(or OSI 7계층) 순서대로 네트워크에 접근하는데, HTTP는 4 응용(Application) 계층에 속한다.
  • Layers
  • HTTP 통신 과정
    • 4 응용 계층에서 정보를 만들어 전달
    • 3 전송(Transport) 계층에서 통신 노드를 연결
    • 2(Internet) 계층에서 통신 노드 간 패킷을 전송, 라우팅
    • 1(Network Interface) 계층에서 전기적 신호로 변환하여 실제로 전송하게 된다.
    • 받는 쪽에서는 반대의 과정을 그대로 거친다.
  • 모든 컴퓨터와 서버는 네트워크를 통해 외부에서 접근하기 위해 IP 주소가 필요하다.
  • 그러나 사용자는 브라우저를 이용하여 문자 URL을 전달하기 때문에 이를 해석하기 위해 HTTP 요청 시, DNS 서버로 접근하여 해당 Domain Name에 맞는 IP를 받아오는 과정을 거친다.
    • 이러한 과정을 ‘이름 해결’이라 부르며 UDP 통신을 한다.
    • 그 이후에 일반적으로, 받아온 IP를 갖고 한 번에 서버에 접근하는 것이 아니라, IP를 알고 있는 다른 서버에 경유하면서 여러 단계에 거쳐 접근하게 된다.

2. Request & Response

HTTP 통신은 Request와 Response로 이루어진다.

  • 일반적으로, 클라이언트에서는 Request를 만들고 서버는 요청에 해당하는 Response를 클라이언트에 반환한다.
  • HTTP의 데이터 형식은 Header와 Body로 구성되어 있다.
    • Request Header는 데이터를 요청하기 위한 서버가 인식할 수 있도록 약속된 형식을 따라야 한다.
    • Request & Response

      (1) Request Header

      • GET / HTTP/1.1 : HTTP전송 방법과 프로토콜 버전
      • Host : 요청하는 서버 주소
      • User-Agent : OS/브라우저 정보
      • Accept : 클라이언트 이해 가능한 컨텐츠 타입
      • Accept-Language : 클라이언트 인식 언어
      • Accept-Encoding : 클라이언트 인코딩 방법Connection: 전송 완료후 접속 유지 정보 (keep-alive)
      • Upgrade-Insecure-Requests : 신호를 보낼때 데이터 암호화 여부
      • Content-Type : 클라이언트에게 반환되어야하는 컨텐츠 유형
      • Content-Length : 본문크기

      (2) Response Header

      • HTTP/1.1 200 ok : 프로토콜 버전과 응답상태
      • Access-Control-Allow-Origin : 서버에 타 사이트의 접근을 제한하는 방침
      • Connection : 전송 완료 후 접속 유지 정보 (keep-alive)
      • Content-Encoding : 미디어 타입을 압축한 방법
      • Date : 헤더가 만들어진 시간
      • ETag : 버전의 리소스를 식별하는 식별자
      • Keep-Alive : 연결에대한 타임아웃과 요청 최대 개수 정보
      • Last-Modified : 웹 시간을 가지고 있다 수정되었을때만 데이터 변경 ( 캐시연관 )
      • Server : 웹서버로 사용되는 프로그램 이름
      • Set-Cookie : 쿠키 정보
      • Transfer-Encoding : 인코딩 형식 지정
      • X-Frame-Options : frame/iframe/object 허용 여부
    • GET 요청에는 Body가 필요없지만, 다른 요청 방식들에서는 서버의 API가 요구하는 데이터 형식에 맞게 Body로 데이터를 전송해야 한다.

3. HTTP 1.0, 1.1, 2.0

  • HTTP 1.0과 1.1의 차이
    • HTTP 1.1의 표준으로 HTTP Request Header에 Host가 추가되었다.
      • 이 차이 때문에 1.0에서는 DNS를 통해 호스트의 IP 주소를 알아내고 나면 어떤 도메인으로 요청된 것인지를 알 수 없었다. referer 등의 헤더로 우회 구현할 수 있었지만 Host 헤더의 역할을 완벽히 대체할 수는 없었다.
      • 한 서버에서 여러 개의 도메인 네임을 호스팅하는 가상 호스팅이 보편화되면서 요청한 자원의 경로(URL의 일부분)는 알지만, 도메인 네임을 모르는 것이 큰 단점으로 작용하게 되면서 Host 헤더가 도입되었다.
  • HTTP 2.0
    • 2.0 부터는 TLS(Transfer Layer Security) 적용이 의무화되어 보다 안전한 규약을 제공하게 되었다.
      • TLS는 이전의 HTTP에서 SSL(Secure Sockets Layer)이 표준화되면서 바뀐 이름이다.
      • TLS는 인터넷처럼 TCP/IP 네트워크를 사용하는 통신에 적용되며, 통신 과정에서 전송 계층 종단 간 보안과 데이터 무결성을 확보해준다.
        • 클라이언트/서버 응용 프로그램이 네트워크로 통신을 하는 과정에서 도청, 간섭, 위조를 방지하기 위해 설계되었다. 암호화를 통해 최종단의 인증, 통신 기밀성을 유지한다.
      • TLS의 3 단계 과정
        • 서버와 클라이언트 간 암호 스위트를 교환 : 키 교환과 인증에 사용될 암호화 방법(알고리즘)을 결정
        • 키 교환, 인증 : 공개키 방법을 사용하거나, 미리 공유된 키를 사용할 수도 있다. 메시지 인증 코드(MAC)를 HMAC 해시 함수로 생성
    • 기존 규격에서는 하나의 요청을 처리하고 4-way Handshake를 거친 후에야 통신이 종료되고 다음 통신으로 넘어갔지만, 2.0에서는 스트림을 엶으로써 필요한 정보를 계속 요청하거나 수신할 수 있다. 이 과정에서 헤더는 압축되어 표현된다. 연결을 끊고 새로 만드는 오버헤드를 절감하여 기존 규격보다 빠른 속도의 통신을 제공할 수 있다.
    • 클라이언트가 특정 경로로 요청을 보냈을 때 부가적으로 요청해야 할 자원들(웹페이지의 경우 CSS나 JS 파일)을 서버에서 미리 알고 푸시하는 서버 푸시 기능으로도 기존의 규격보다 오버헤드를 절감하여 빠른 속도의 통신을 제공할 수 있다.

4. HTTP Method

  • GET, POST, PUT, PATCH, DELETE, HEAD, TRACE
  • OPTIONS : 서버에서 허용한 메서드를 확인하기 위한 요청 방식 (Allow 헤더에 허용된 메서드들을 포함하여 응답한다.)
    • Preflight Request 방식에서 서버에 요청을 보내는 것이 안전한지 확인하고, 서버와 다른 도메인에서 접근하며, POST, PUT 등 요청 방식들이 서버의 자원을 변경하는 요청이면서 많은 데이터를 전송할 수 있기 때문에 서버가 해당 도메인에서의 요청 허용 여부와 서버의 상태를 확인하기 위해 예비 요청으로써 호출된다.

5. HTTP Response Code

  • 100 번대 : 단순 정보
    • 100 Continue : 임시 응답으로서, 지금까지의 상태가 양호하며 클라이언트가 계속해서 요청을 하거나, 이미 요청을 완료한 경우에 무시해도 된다.
    • 101 Switching Protocol : 클라이언트가 보낸 Upgrade 요청 헤더에 대한 응답에 들어가며, 서버에서 프로토콜을 변경할 것을 알려준다.
  • 200 번대 : 요청 성공
    • 200 OK : 요청이 성공적으로 처리되었음을 알린다. 성공의 의미는 HTTP Method에 따라 다르다.
      • GET : 리소스를 불러와서 메시지 바디에 전송되었음.
      • HEAD : 개체 헤더가 메시지 바디에 있음.
      • PUT or POST : 수행 결과에 대한 리소스가 메시지 바디에 전송되었음.
      • TRACE : 메시지 바디는 서버에서 수신한 요청 메시지를 포함하고 있음.
    • 201 Created : 요청이 성공적으로 처리되었으며, 그 결과로 새로운 리소스가 생성되었음을 알려준다. 일반적으로 POST, PUT 요청 이후에 응답하는 코드
    • 202 Accepted
    • 203 Non-Authoritative Information
    • 204 No Content
  • 300 번대 : 변경
    • 301 Moved Temporarily
    • 302 Found
    • 304 Unchanged
  • 400 번대 : 요청(클라이언트) 측 오류
    • 400 Bad Request
    • 401 Unauthorized
    • 403 Forbidden
    • 404 Not Found
  • 500 번대 : 서버 측 오류
    • 500 Internal Server Error
    • 503 Bad Gateway