[Http] HTTP에 대해 알아보자

Updated:

HTTP 통신

Http란?

-HyperText Transfer Protocol의 약자로서 웹브라우저(클라이언트)와 웹서버(서버) 간의 통신 규약을 의미함

-클라이언트가 도메인+URL로 요청을 하면, 서버가 요청에 따른 응답(html문서 등…)을 해줌

-예를 들어, https://lims.org/test 이런 식으로 요청을 하면, lims.org 서버에서 test로 접근을 하여 그에 대한 응답을 보내준다

-통신 시에 Request Header(웹브라우저가 웹서버에 요청 시 작성한 것)와 Response Header(웹서버가 웹브라우저에 응답 시 작성한 것)에 대해 반드시 알아두어야 함

요청

-클라이언트가 브라우저를 통해 http://localhost:8080/ 에 대한 정보를 달라고 요청한다고 가정해보자. 사이트만 보고 있으면 요청에 대한 정보로서 무엇이 날아가는지 모르지만, 크롬 개발자 도구를 이용하면 다양한 정보들이 요청되고 응답됨을 알 수 있다

-이러한 정보들을 HTTP 메시지라고 하며 크게 시작줄, 헤더, 본문으로 구성되어 있다. 간략히 설명하자면, 시작줄 부분을 통해 GET http://localhost:8080/ 으로 요청을 보내는 것을 알 수 있고 헤더를 통해 요청에 대한 정보를 알 수 있다. 본문을 통해 요청 시에 보낼 데이터를 담을 수 있다. 본문이 없을 수도 있다. 자세한 건 아래에서 알아보자.

응답

-클라이언트가 GET http://localhost:8080/ 으로 요청을 보냈을 때 서버에서 어떻게 응답할지에 대한 정보를 담고 있다

-Status Code가 200임을 통해 요청에 대한 응답이 성공했음을 알 수 있다. 그리고 응답은 요청과 달리 대부분 본문이 존재한다. 클라이언트가 데이터를 요청하면, 웹서버가 응답메시지에 요청한 데이터를 보내주는데, 이 응답 메시지에 html이 담겨있고 브라우저가 이 html을 받아 화면에 렌더링 해주는 것이다.

HTTP 요청 메서드

-클라이언트가 웹서버에게 사용자 요청의 목적/종류를 알리는 수단

-HTTP 요청 메서드에는 GET, POST, PUT, DELETE, HEAD 등등이 있음

-GET: URL형식으로 웹서버측의 리소스(데이터)를 요청함(REST적으로 가져오다의 의미)
-POST: 클라이언트에서 웹서버로 어떤 내용을 전송함. 요청 데이터를 HTTP Body에 담아 웹서버로 전송함
-PUT: POST처럼 정보를 웹서버로 전송하는 형식은 동일하나, 갱신 위주로 사용함
-DELETE: 임의의 웹 리소스를 제거할 때 사용함
-HEAD: GET과 비슷하나, 실제 문서를 요청하는 것이 아니라 헤더 정보만 요청함

헤더

헤더를 크게 공통헤더, 요청헤더, 응답헤더로 나누어 설명해볼 것이다

[공통 헤더]

-요청과 응답에 모두 포함되어 있는 헤더

  1. Date: HTTP메시지가 만들어진 시각
  2. Connection: 기본값으로 keep-alive를 사용함
  3. Content-Length: 본문 크기를 바이트 단위로 표시함
  4. Cache-Control: 캐시를 사용하고 싶을 때 사용함
  5. Content-Type: content(보내려는 자원)의 타입과 문자열 인코딩을 명시함. 일반적인 html form으로 전송할 때 쓰는 multipart/form-data, w-www-form-urlencoded과 api에서 json타입을 사용할 때 쓰는 application/json에 대해 알아두는 것이 좋음
  6. Content-Language: 사용자의 언어를 지정함
  7. Content-Encoding: br, gzip 등 임의의 알고리즘으로 압축해서 사용하면 요청, 응답 속도가 빨라지기 때문에 사용함

[요청 헤더]

http요청헤더

-요청에 대한 정보가 포함되어 있는 헤더

  1. Host: 웹서버의 도메인네임 eg) localhost:8080
  2. User-Agent: 사용자가 어떤 클라이언트를 통해 요청을 보냈는지 알 수 있음
  3. Accept: 요청을 보낼 때, 웹서버가 이런 타입의 데이터를 보내줬으면 좋겠다고 명시할 때 사용함
  4. Origin: POST 요청을 보낼 시에 요청이 어느 주소에서 시작되었는지를 나타냄. 요청을 보낸 주소와 받는 주소가 다르면 CORS 문제가 발생할 수 있음
  5. Referer: 이 페이지 이전의 페이지 주소가 담겨 있음
  6. Authorization: 인증 토큰을 웹서버로 보낼 때 사용하는데 API요청 시에 토큰이 없으면 거절당하기 때문에 이를 사용함

[응답 헤더]

http응답헤더

-응답에 대한 정보가 포함되어 있는 헤더

  1. Access-Control-Allow-Origin: 요청을 보내는 프론트 주소와 백엔드 주소가 다를 때 발생하는 CORS에러를 해결하기 위해 이 헤더에 프론트 주소를 적어주어야 함. 만약, 주소를 일일이 지정하기 싫다면 *을 이용해도 되지만 그만큼 보안이 취약해짐

참고) CORS(Cross Origin Resource Sharing)란?
-도메인 또는 포트가 다른 서버의 자원을 요청하는 매커니즘을 의미함
-웹개발을 하다보면 한번쯤 겪게되는 이슈로 클라이언트와 서버의 origin이 다를 때 발생하는 이슈랑 관련됨
-이 이슈를 해결하기 가장 쉬운 방법은 서버와 클라이언트가 같은 도메인과 포트를 사용하면 됨

  1. Allow: 요청에 대응하는 헤더로 웹서버가 허용하는 HTTP 메서드와 헤더를 응답하는데 사용됨. eg) POST방식은 되고 GET 방식은 안되게 하고 싶다면 Allow: POST 이런식으로 지정해주면 됨
  2. Content-Disposition: 응답 본문을 브라우저가 어떻게 표시해야 할지 알려주는 헤더로서 inline이면 화면에 표시하고 attachment면 다운로드함
  3. Location: 300번대 응답이나 201 응답일 때 어느 페이지로 이동해야할지를 알려주는 헤더
  4. Content-Security-Policy: 다른 외부 파일들을 불러오는 경우, 차단할 소스와 불러올 소스를 명시하는 헤더

Leave a comment