[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과 비슷하나, 실제 문서를 요청하는 것이 아니라 헤더 정보만 요청함
헤더
헤더를 크게 공통헤더, 요청헤더, 응답헤더로 나누어 설명해볼 것이다
[공통 헤더]
-요청과 응답에 모두 포함되어 있는 헤더
- Date: HTTP메시지가 만들어진 시각
- Connection: 기본값으로 keep-alive를 사용함
- Content-Length: 본문 크기를 바이트 단위로 표시함
- Cache-Control: 캐시를 사용하고 싶을 때 사용함
- Content-Type: content(보내려는 자원)의 타입과 문자열 인코딩을 명시함. 일반적인 html form으로 전송할 때 쓰는 multipart/form-data, w-www-form-urlencoded과 api에서 json타입을 사용할 때 쓰는 application/json에 대해 알아두는 것이 좋음
- Content-Language: 사용자의 언어를 지정함
- Content-Encoding: br, gzip 등 임의의 알고리즘으로 압축해서 사용하면 요청, 응답 속도가 빨라지기 때문에 사용함
[요청 헤더]

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

-응답에 대한 정보가 포함되어 있는 헤더
- Access-Control-Allow-Origin: 요청을 보내는 프론트 주소와 백엔드 주소가 다를 때 발생하는 CORS에러를 해결하기 위해 이 헤더에 프론트 주소를 적어주어야 함. 만약, 주소를 일일이 지정하기 싫다면 *을 이용해도 되지만 그만큼 보안이 취약해짐
참고) CORS(Cross Origin Resource Sharing)란?
-도메인 또는 포트가 다른 서버의 자원을 요청하는 매커니즘을 의미함
-웹개발을 하다보면 한번쯤 겪게되는 이슈로 클라이언트와 서버의 origin이 다를 때 발생하는 이슈랑 관련됨
-이 이슈를 해결하기 가장 쉬운 방법은 서버와 클라이언트가 같은 도메인과 포트를 사용하면 됨
- Allow: 요청에 대응하는 헤더로 웹서버가 허용하는 HTTP 메서드와 헤더를 응답하는데 사용됨. eg) POST방식은 되고 GET 방식은 안되게 하고 싶다면 Allow: POST 이런식으로 지정해주면 됨
- Content-Disposition: 응답 본문을 브라우저가 어떻게 표시해야 할지 알려주는 헤더로서 inline이면 화면에 표시하고 attachment면 다운로드함
- Location: 300번대 응답이나 201 응답일 때 어느 페이지로 이동해야할지를 알려주는 헤더
- Content-Security-Policy: 다른 외부 파일들을 불러오는 경우, 차단할 소스와 불러올 소스를 명시하는 헤더
Leave a comment