HTTP의 기초

Jivyy·2020년 5월 17일
1

WECODE

목록 보기
17/20
post-thumbnail

HTTP

HTTP(HyperText Transfer Protocol)란?

HTML 과 같은 하이퍼미디어 문서를 전송하기 위한 통신 규약.
(예를 들어 http는 대화를 하기 위해 필요한 공통의 '한국어'와 같은 언어라고 생각할 수 있고 이 언어는 목소리와 같은 역할인 '네트워크'를 통해서 전달된다고 생각할 수 있다.)
웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트 - 서버를 이어주는 프로토콜이다.

HTTP 의 특징

  • stateless : 상태를 저장하지 않는다. 요청이 오면 응답을 할 할 뿐, 여러 요청/응답끼리 연결되어 있지 않다(독립적).
    따라서 여러 진행과정이나 데이터가 필요할 때는 쿠키나 세션을 이용하게 된다. (ex.로그인, 장바구니, 개인화, 트래킹..)
    (여러 통신을 기록하지 않는다. 사전에 어떤 통신들이 있었는지 알지 못함(정보를 저장하지 못함) - 여기서 문제가 발생한다.
    로그인을 했는데 로그인을 했다는 것을 기억하지 못한다면???
    이를 해결하기 위해 쿠키와 세션이 있다. 브라우저 자체에서 쿠키를 사용해서 로그인했다는 정보를 저장을 해 두었다가 다른 리퀘스트를 보낼 때 로그인을 했다는 정보를 첨부해서 보내는 것
    보안이 중요한 은행같은 사이트에서는 쿠키에 저장할 수 있는 기간을 짧게 할 것이고 페이스북같은 사이트에서는 유저가 바로 정보를 볼 수 있도록 기간을 길게한다.)
  • 클라이언트와 서버들은 개별적인 메시지 교환에 의해 통신하는데
    보통 브라우저인 클라이언트에 의해 전송되는 메시지를 요청(requests),
    그에 대해 서버에서 응답으로 전송되는 메시지를 응답(responses)이라고 부른다.

HTTP 의 구조

HTTP 요청과 응답의 구조는 서로 닮았으며, 구조는 startline- header- body로 이루어져 있다.

  • 시작 줄(start-line)에는 실행되어야 할 요청, 또은 요청 수행에 대한 성공 또는 실패가 기록되어 있다.
  • 옵션으로 HTTP 헤더 세트가 들어간다. 여기에는 요청에 대한 설명, 혹은 메시지 본문에 대한 설명이 기록.
  • 요청에 대한 모든 메타 정보가 전송되었음을 알리는 빈 줄(blank line).
  • 요청과 관련된 내용(HTML 폼 콘텐츠 등)이 옵션으로 들어가거나, 응답과 관련된 문서(document).
    (본문의 존재 유무 및 크기는 첫 줄과 HTTP 헤더에 명시)
  • HTTP 메시지의 시작 줄과 HTTP 헤더를 묶어서 요청 헤드(head)라고 부르며,
    이와 반대로 HTTP 메시지의 페이로드는 본문(body)이라고 한다.

HTTP Request의 구조

Http request 란 클라이언트 쪽에서 서버가 특정 동작을 취하도록 전송하는 메세지로
3단으로 이루어진 구조에 대한 상세한 내용은 다음과 같다.

Start line:

  1. http method :
    동사(GET, POST) 혹은 명사(GEAD,OPTIONS)를 사용해서 서버가 어떤 동작을 취해야 하는지를 알려준다.
    GET은 리소스를 클라이언트로 가져오라는 것이며 POST는 데이터가 서버로 들어가야 하는 것을 의미한다(리소스 수정 등)

  2. Request Target:
    해당 request 가 전송되는 목표 url 이나 프로토콜, 포트, 도메인의 절대 경로로 나타날 수도 있다.
    origin, absolute, authority, asterlist 등의 형식이 있다.

  3. http version :
    어떤 http 버젼이 사용되고 있는지를 나타낸다.

Header
해당 request에 대한 추가 정보를 답고 있다. 대소문자 구분 없는 문자열과 (:)을 사용하며 (key:value)
크게 3 부분으로 나누어진다. (general headers, request headers, entitiy headers)

자주 사용되는 중요한 headr 정보들은 다음과 같다.

host :
ex) google.com가 host ㅈnth
host header + request target 을 합치면 완전한 url 이 된다.

ex)저희 집 host:은마아파트로 오세요 ' 라고 말하면 찾아올 수 없다.
상세주소인 request target 00동 00호 이 없기 때문이다.

User-Agent
보내는 클라이언트에 대한 정보가 담겨있는 정보.
요즘 많이 저장하는 정보들, 빅데이터 수집 등을 위해서.

Accetp

connection
보통은 dafualt 로 유지.

Body
해당 request 의 실제 메세지/내용
하지만 모든 요청에 본문이 들어가지는 않는다.
GET, HEAD, DELETE , OPTIONS처럼 리소스를 가져오는 요청은 보통 본문이 필요가 없으나 일부 요청은 업데이트를 하기 위해 서버에 데이터를 전송한다. 보통 (HTML 폼 데이터를 포함하는) POST 요청일 경우에 그러하다.

HTTP Response의 구조

http request 와 마찬가지로 3단 구조.
Status Line
1. Http version
2.Status code : 응답 상태(요청의 성공여부)를 나타내는 숫자로 표현되는 코드. 예를 들어 200. 403
3. Status Text 사람이 코드만 보고 인식하기는 쉽지 않으므로 텍스트로 해당 status를 간략히 설명해준다. "not Found"

Headers
메타 정보가 담겨져있다.
user-agent 대신 server 헤더가 사용된다.ex) 장고

body
생략이 가능하다.
예를 들어 로그인을 하는 경우 유저가 id 와 패스워드를 보내면 서버에서 이를 확인하고 이에 대한 응답을 status code 인 200ok 로 보내주면 간단하기 때문에 body 는 필요없게 된다.

그렇다면 로그인을 성공했을때 페이지 이동은 코드 없이 어떤 방식으로 이루어지는가?
status code 200만 보내면 프론트엔드에서 미리 준비해 둔 html /javascript code 에서 렌더링 하는 것이다.

spa (single page application) 3세대 방식
예전에는 응답에 따라 백엔드에서 code를 일일히 보내주었다면
이제는 리액트같은 프레임워크를 사용해서 코드 status 만을 보고 바로 프론트엔드쪽에서 html을 렌더링하는 방식으로 처리한다.
하지만 구글,네이버같은 방대한 자료를 가지고 있는 곳에서는 3세대 방식의 적용이 어려운 면도 있다.

이런것들은 라이브러리가 작성해주지만
http method 에 대해서는 개발자가 결정해야한다.
get? post 어떤 것으로 보낼 것인가?
get : 어떤 데이터를 서버로부터 받아올 때 사용
데이터 생성/수정/삭제 없이 받아오기만 할 때 사용하므로 간단하고 많이 사용된다. body 가 비어있다.

post : 데이터 생성/수정/삭제 할 때 주로 사용.
대부분의 경우 request body 가 포함되어 보내진다.

delete : 특정 데이터를 서버에서 삭제요청할 때 사용
그러나 post 에 밀려서 잘 사용하지는 않는다.

자주 쓰이는 http status code

어떤 응답을 보낼것인가도 개발자가 정해야 하므로 잘 알아야 한다.

  • 200ok : 문제 없이 잘 실행 되었을 때.

  • 400 bad request : 요청이 잘못 되었을 때. ex) 전화번호칸에 text 들어왔을 때. 개발자에 따라 400을 보낼수도, 500을 보낼 수도 있으나 정확한 코드인 400을 보내는 것이 좋다.

  • 401 unauthorized : 유저가 해당요청을 하려면 먼저 로그인을 하거나 회원가입을 하거나 등등이 필요하다는 것을 나타내려 할때 쓰이는 코드.(이 경우 프론트엔드 쪽에서 이것을 알리고 로그인이나 회원가입 페이지로 이동하도록 해주어야 한다.)

  • 403 Forbidden : 로그인이 아닌 권한의 문제. ex) 과금한 유저만 볼 수 있는 데이터를 아닌 유저가 요청할 때.

  • 404 Not Found
    request target, host 가 찾아지지 않는 경우.
    connection error.
    ex)아예 /wio 라는 target이 없는 경우.

  • 500 Internal Server Error
    서버에서 에러가 난 경우. 백엔드 개발자가 싫어하는 코드.

profile
나만의 속도로

0개의 댓글