출처 : https://goddaehee.tistory.com/169
위의 블로그를 보고 공부용으로 그대로 정리해본 벨로그
브라우저를 통해 사이트(ex. http://goddaehee.tistory.com)에 대한 정보를 달라고 요청한다.
요청을 보낼 때 요청에 대한 정보를 담아 서버로 보낸다.
GET http://goddaehee.tistory.com/168 HTTP/1.1
첫번째 줄은 GET / HTTP/1.1 (HTTP 버전)
두번째 줄부터 헤더 (요청에 대한 정보)
HTTP/1.1 200 OK
첫번째 줄 200 OK는 요청성공
두번째 줄부터 Request와 마찬가지로 헤더 정보이다.
Response에선 헤더 이외에도 더 많은 정보가 들어있는데 이 부분이 본문이다.
요청시 데이터를 요청하면, 응답 메시지에는 요청한 데이터를 담아서 보내주는데 이 응답 메시지에 HTML이 담겨 있다. 이 HTML을 받아 브라우저가 화면에 렌더링한다.
개발자도구(F12)의 네트워크 탭, 피들러 등을 통해 헤더들을 확인할 수 있다.
1.1 Date
HTTP 메시지가 만들어진 시각이다. 자동으로 만들어진다.
ex) Date: Sun, 13 Jan 2019 17:28:13 GMT
1.2 Connection
일반적으로 HTTP/1.1을 사용하며 Connection은 클라이언트와 서버 간 연결에 대한 옵션 설정이다.
ex) Connection: keep-alive => 현재 TCP 커넥션을 유지
Connection: close => 현재 HTTP 메시지 직후에 TCP 접속을 끊는다는 것을 알림
1.3 Content-Length
요청과 응답 메시지의 본문 크기를 바이트 단위로 표시해준다. 메시지 크기에 따라 자동으로 만들어진다.
ex) Content-Length: 88052
1.4 Cache-Control
https://goddaehee.tistory.com/171
1.5 Content-Type
컨텐츠의 타입(MIME 미디어 타입)과 문자열 인코딩(utf-8 등등)을 명시할 수 있다.
ex) Content-Type: text/html; charset=utf-8(현재 메시지 내용이 text/html 타입이고 문자열은 utf-8 문자열)
서버로 데이터를 보낼 때는 text/html 대신 www-url-form-encoded, multipart/form-data 등이 Content-Type이 된다.
1.6 Content-Language
사용자의 언어
1.7 Content-Encoding
응답 컨텐츠를 br, gzip, deflate 등의 알고리즘으로 압축해서 보내면, 브라우저가 알아서 해제해서 사용한다.
이 외에도 다양한 압축 알고리즘이 존재한다.
요청이나 응답 전송 속도도 빨라지고, 데이터 소모량도 줄어들기 때문에 사용한다.
ex) Content-Encoding: gzip, deflate
Content-Encoding은 컨텐츠 압축된 방식이다.
2.1 Host
서버의 도메인 네임
Host 헤더는 반드시 하나가 존재해야 한다.
EX) host: goddaehee.tistory.com
2.2 User-Agent
가장 흔하게 보고 사용하는 헤더이다.
현재 사용자가 어떤 클라이언트(운영체제, 앱, 브라우저 등)를 통해 요청을 보냈는지 알 수 있다.
ex) User-Agent: Mozilla/5.0(Windows NT 6.1; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
=> Window로 크롬 브라우저를 통해 접속 하였다. 다만 헤더는 변경 할 수 있기 때문에 무조건 신뢰할 수는 없음
2.3 Accept
클라이언트가 허용할 수 있는 파일 형식(MIME TYPE)
ex1) Accept: text/html (HTML 형식인 응답을 처리하겠다)
ex2) Accept: image/png, image/gif
ex3) Accept: text/*
콤마로 여러 타입을 동시에 적어줄 수도 있고, *(와일드카드)로 텍스트면 ok라고 요청할 수 있다.
Accept로 원하는 형식을 보내고, 서버가 응답하면서 헤더의 Content를 설정하게 된다.
2.4 Cookie
웹서버가 클라이언트에 쿠키를 저장해 놓았다면 해당 쿠키의 정보를 이름-값 쌍으로 웹서버에 전송한다.
2.5 Origin
POST같은 요청을 보낼 때, 요청이 어느 주소에서 시작되었는지를 나타내는데 이때 보낸 주소와 받는 주소가 다르면 CORS 문제가 발생하기도 한다.
2.6 If-Modified-Since
페이지가 수정되었으면 최신 버전 페이지 요청을 위한 필드
만일 요청한 파일이 이 필드에 지정된 시간 이후로 변경되지 않았다면, 서버로부터 데이터를 전송받지 않는다.
2.7 Authorization
Authorization 헤더는 인증 토큰을 서버로 보낼 때 사용하는 헤더.
API 요청같은 것을 할 때 토큰이 없으면 거절당하기 때문에 이 때, Authorization을 사용한다.
JWT(Json Web Token)을 사용한 인증에서 주로 사용한다.
ex) Authorization: Bearer xxx.xxx.xxx
3.1 Server
웹서버 정보를 나타낸다.
3.2 Access-Control-Allow-Origin
요청 Host와 응답 Host가 다르면 CORS 에러가 발생하는데 서버에서 응답 메시지 Access-Control-Allow-Origin 헤더에 프론트 주소를 적어주면 에러가 발생하지 않는다.
ex) Access-Control-Allow-Origin: goddaehee.tistory.com
관련 헤더
3.3 Allow
Allow 헤더는 CORS 요청 외에도 적용된다.
ex) Allow: GET
위와 같은 경우는 GET 요청만 받는다. POST와 같은 경우는 405 Method Not Allowed 에러를 Return 한다.
3.4 Content-Disposition
응답 본문을 브라우저가 어떻게 표시해야 할지 알려주는 헤더
3.5 Location
300번대 응답이나 201 Created 응답일 때 어느 페이지로 이동할지를 알려주는 헤더
ex) HTTP/1.1 302 Found
Location: /login
위와 같은 응답시 브라우저는 /login 주소로 리다이렉트
3.6 Content-Security-Policy
다른 외부 파일들을 불러오는 경우, 차단할 소스와 불러올 소스를 여기에 명시할 수 있다.
하나의 웹 페이지는 다양한 외부 소스들을 불러온다. (이미지, JS, CSS, 폰트, 아이프레임 등)
ex) Content-Security-Policy: default-src 'self' (자신의 도메인의 파일들만 가져올 수 있다)
Content-Security-Policy: default-src https: (https를 통해서만 파일을 가져올 수 있다)
Content-Security-Policy: default-src 'none' (못가져 오게 만듬)
크롬 주소창에 http://goddaehee.tistory.com 이라고 치는것
=> GET http://goddaehee.tistory.com HTTP/1.1 요청을 보내는 것과 같다.
이때 주소와 함께 HTTP 메서드를 같이 보낼 수 있는데 자주 쓰는 HTTP 메서드는 다음과 같다.
GET : 지정된 리소스(URI)를 요청
POST : 서버가 클라이언트의 폼 입력 필드 데이터의 수락을 요청. 클라이언트는 서버로 HTTP Body에 Data를 전송
PUT : 클라이언트가 전송한 데이터를 지정한 URI로 대체한다. ftp의 PUT과 동일하며, 클라이언트는 서버로 HTTP Body에 Data를 전송한다.
DELETE : 클라이언트가 지정한 URI를 서버에서 삭제한다.
HEAD : 문서의 헤더 정보만 요청하며, 응답데이터(body)를 받지 않는다.
TRACE : 클라이언트가 요청한 자원에 도달하기까지의 경로를 기록하는 루프백(loop back) 검사용. 클라이언트가 요청자원에 도달하기까지 거쳐가는 프록시나 게이트웨이의 중간 경로부터 최종 수신 서버까지의 경로를 알아낼 때 사용