[Programming] HTTP(HyperText Transfer Protocol)

황인용·2020년 1월 21일
0

Programming

목록 보기
3/8

HTTP(HyperText Transfer Protocol)

HTTP는 HyperText Transfer Protocol의 약자로 하이퍼텍스트 문서를 교환하기 위하여 사용된 통신규약이다. 즉, 웹 서버와 클라이언트 간의 통신을 하기 위한 통신 규약이다.
HTTP는 웹에서만 사용하는 프로토콜로 TCP/IP 기반으로 서버와 클라이언트의 요청과 응답을 전송한다.

image.png

HTTP 동작

클라이언트 즉, 사용자가 브라우저를 통해서 어떠한 서비스를 url을 통하거나 다른 것을 통해서 요청(request)을 하면 서버에서는 해당 요청사항에 맞는 결과를 찾아서 사용자에게 응답(response)하는 형태로 동작한다

  • 요청 : Client => Server
  • 응답 : Server => Client
    HTML문서만이 HTTP통신을 위한 유일한 정보 문서는 아니다.
    Plain text로 부터 JSON 데이터 및 XML과 같은 형태의 정보도 주고 받을 수 있으며, 보통은 클라이언트가 어떤 정보를 HTML 형태로 받고 싶은지, JSON현태로 받고 싶은지 명시해주는 경우가 많다.

HTTP특징

  • HTTP메세지는 HTTP서버와 HTTP클라이언트에 의해 해석이 된다.
  • TCP / IP를 이용하는 응용 프로토콜이다.
  • HTTP는 연결 상태를 유지하지 안흔 비연결성 프로토콜이다.(Stateless)
  • HTTP는 연결을 유지하지 않는 프로토콜이기 때문에 요청/응답(request/response) 방식으로 동작한다.

HTTP Request의 구조

  • Start Line
  • Headers
  • Body

예시

POST /payment-sync HTTP/1.1 #1 Start Line

#2 Headers
Aceept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3

#3 Body
{
	"imp_uid": "imp_1234567890",
	"merchant_uid": "order_id_8237352",
	"status": "paid"
}	

1. Start Line

  • HTTP request의 첫 라인
  • HTTP request start line은 HTTP Method, Request target, HTTP Version 3가지로 구성
GET /search HTTP/1.1
  • HTTP Method
    - 해당 request가 의도한 action을 정의하는 부분.
    - HTTP Methods에는 GET, POST, PUT, DELETE, OPTIONS 등등이 있다.
    • 주로 GET, POST를 많이 사용.
  • Request Target
    - 해당 request가 전송되는 목표 uri
    • 예를 들어 /login
  • HTTP Version
    - HTTP버전. 1.0, 1.1, 2.0 이 있음

2. Headers

  • 해당 request에 대한 추가 정보(addtional infomation)를 담고 있는 부분.
    (ex. request메세지 body의 총길이(Content-Length) 등.)
  • key : value 값으로 구성되어 있다 (:이 사용됨)
  • host : google.com
    => Key = HOST, Value => google.com
  • Headers는 3부분으로 나눠진다.( general headers, request headers, entity headers)
  • 자주 사용하는 header 정보
    - HOST
    : 요청이 전송되는 target의 host uri (ex. google.com)
    • User-Agnet
      : 요청을 보내는 클라이언트의 대한 정보 (ex. 웹브라우저에 대한 정보)
    • Accept
      : 해당 요청이 받을 수 있는 응답(response)타입.
    • Connection
      : 해당 요청이 끝난 후에 클라이언트와 서버가 계속해서 네트워크 커넥션을 유지 할 것인지 아니면 끊을 것인지에 대한 지시부분.
    • Content-Type
      : 해당 요청이 보내는 메세지 body의 타입. (ex. JSON을 보내면 application/json)
    • Content-Length
      : 메세지 body의 길이
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json
Content-Length: 257
Host: google.com
User-Agent: HTTPie/0.9.3

3. Body

  • 해당 request의 실제 메세지 내용
  • body가 없는 request도 있음(ex. GET request)
POST /payment-sync HTTP/1.1

Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3

{
    "imp_uid": "imp_1234567890",
    "merchant_uid": "order_id_8237352",
    "status": "paid"
}

HTTP Response 구조

  • Status Line
  • Headers
  • Body

1. Status Line

  • HTTP 응답 메세지 상태를 간략히 요약해주는 부분
  • HTTP Version, Status Code, Stauts Text로 나타남
    - HTTP Version
    : HTTP 응답 메세지의 버전정보
    • Status Code
      : 응답 상태를 나타내는 코드. 순자로 되어 있는 코드 (ex. 200, 400, 500 등등)
    • Status Text
      : 응답 상태를 간략하게 설명해주는 부분 (ex. Not Found 등등)
HTTP/1.1 404 Not Found

2. Headers

  • Request의 headers와 일반적으로 동일하다
  • 다만 Response에서만 사용되는 header의 값들이 있다
    - ex. User-Agent대신 Server를 사용

3. Body

  • Request의 body와 일반적으로 동일하다
  • Request와 마찬가지로 모든 response가 body가 있지는 않다. 데이터를 전송할 필요가 없을 경우에는 body내용이 비어있다
HTTP/1.1 404 Not Found

Connection: close
Content-Length: 1573
Content-Type: text/html; charset=UTF-8
Date: Mon, 20 Aug 2018 07:59:05 GMT

<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 404 (Not Found)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
  </style>
  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
  <p><b>404.</b> <ins>That’s an error.</ins>
  <p>The requested URL <code>/payment-sync</code> was not found on this server.  <ins>That’s all we know.</ins>

HTTP Method

HTTP Method는 클라이언트와 서버 사이에 이루어지는 요청(request)과 응답(response) 데이터를 전송하는 방식을 말한다.
HTTP Method 8가지 종류가 있다.

GET

  • 데이터를 서버로 부터 받을 때(GET) 주로 사용되는 Method.

  • URL에 해당하는 정보의 전송 요청.

  • 데이터의 전달 : 이름과 값을 한 쌍으로. (ex. key:value)

  • 데이터의 구분 : & 사용. (ex. key1:value1&key2:value2)

  • 데이터가 URL에 노출.

  • 인코딩.디코딩의 과정이 없기 때문에 POST보다 빠르다.

  • URL의 길이 제약으로 인해 많은 데이터 전송은 무리.

  • 데이터 생성/수정/삭제 없이 받오이기만 할 때 사용한다.

    POST

  • 데이터를 생성/수정/삭제 할 때 주로 사용되는 Method.

  • 데이터는 HTTP Body에 숨겨서 서버로 전송

  • GET으로 받을 수 없는 많은 양의 자료를 전송할 때 사용

PUT

  • 리소스의 전체 부분을 수정(update)할 때 사용되는 Method
  • URI로 지정한 서버에 있는 파일을 대치한다.
  • URI로 지정한 파일이 없는 경우는 파일을 새로 작성한다.

PATCH

  • 리소스의 일부 부분을 수정(update)할 때 사용되는 Method다.
  • GET과 동일하나 HTTP Header 정보만 요청하는 Method.
  • 네트워크 대역을 절약, 리소스의 크기확인시 사용한다.

DELETE

  • URI로 지정한 서버에 있는 파일을 삭제하는 Method.
  • 보안적으로 위험, 비활성화

OPTIONS

  • 어떤 HTTP Method를 지원하는 지를 검사하는 Method.
  • 요청한 URL에 어떤 메소드 요청이 가능한지 확인한다.
  • 보안적으로 위험, 해커들에게 중요한 정보를 제공하게 된다.

TRACE

  • 서버측에서 받은 리퀘스트 라인과 헤더를 그대로 클라이언트로 반송하는 Method.
  • 프록시 서버 등을 쓰는 환경에서 리퀘스트가 바뀌어 써비는 모양을 살표볼 때 사용.
  • Request의 Loopback 테스트용으로 사용 할 수 있다.

CONNECT

  • 터널링 목적으로 연결요청하는 Method.
  • Foward Proxy에 HTTP TLS(Transport Layer Security) 터널링(Tunnelling)을 요청할 때 사용

HTTP Status Code

HTTP Status Code는 굉장히 많은 종류가 있다.
모두 숫자 세자리로 이루어져 있으며, 아래와 같이 크게 다섯 부류로 나눌 수 있다.
참고 : WIKIPEDIA - HTTP 상태코드

  • 1XX (조건부 응답) : 요청을 받았으며 작업을 계속한다.
  • 2XX (성공) : 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킨다.
  • 3XX (리다이렉션 완료) : 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.
  • 4XX (요청 오류) : 클라이언트에 오류가 있음을 나타낸다.
  • 5XX (서버 오류) : 서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.

200 OK

  • 가장 자주 보게되는 status code.
  • 문제없이 다 잘 실행 되었을 때 보내는 코드.

301 Moved Permanently

  • 해당 URI가 다른 주소로 바뀌었을때 보내는 코드.
HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/index.asp

400 Bad Request

  • 해당 요청이 잘못된 요청일때 보내는 코드.
  • 주로 요청에 포한됨 input 값들이 잘못된 값들이 보내졌을때 사용되는 코드.
    (ex. 전화번호를 보내야 되는데 text가 보내졌을 때 등등)

401 Unauthorized

  • 유저가 해당 요청을 진행 할려면 먼저 로그인을 하거나 회원 가입을 하거나 등등 사전작업이 필요하다는 것을 나타내려 할때 사용되는 코드.

403 Forbidden

  • 유저가 해당 요청에 대한 권한이 없다는 뜻.
    (ex. 오직 과금을 한 유저만 볼 수 있는 데이터를 요청 했을때 등등)

404 Not Found

  • 요청된 URI가 존재하지 않는다는 뜻.
http -v google.com/no-such-uri

GET /no-such-uri HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: google.com
User-Agent: HTTPie/0.9.3

HTTP/1.1 404 Not Found
Content-Length: 1572
Content-Type: text/html; charset=UTF-8
Date: Mon, 20 Aug 2018 08:46:48 GMT
Referrer-Policy: no-referrer

500 Internal Server Error

  • 서버에서 에러가 났을때 사용되는 코드.
  • API 개발을 하는 백앤드 개발자들이 싫어하는 코드.
profile
dev_pang의 pang.log

0개의 댓글