HTTP 메세지 개관
HTTP-message = start-line
\*( header-field CRLF )
CRLF
[ message-body]
// CRLF = 개행
헤더 필드는 여러개이고 개행 문자로 구분됨
HTTP 요청 헤더 - start-line
- HTTP 메서드 ( 공백 ) 요청 대상 ( 공백 ) HTTP 버전 ( 개행 )
- GET /restapi/v1.0 HTTP/1.1
HTTP 메서드 : 서버에게 요청할 동작
- GET : 자원 조회
- POST : 요청할 데이터 처리
- PUT : 자원 덮어쓰기
- PATCH : 자원 부분 변경
- DELETE : 자원 삭제
- HEAD : GET과 동일하지만 메시지 부분(body 부분)을 제외하고, 상태 줄과 헤더만 반환
- OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
- CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정
- TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
HTTP 요청 헤더 - massage-body GET 요청
- 일반적으로 쿼리 문자열을 사용하되, 본문은 없음
POST 요청
- 메세지 본문으로 처리할 데이터 전송
- 메세지 본문에 해당하는 데이터를 처리하도록 요청
- 어떻게 처리할지는 서버가 결정 ( e.g. 새 자원 생성, 가공 )
PUT 요청
- 자원 덮어쓰기
- 자원이 있다면 본문으로 보낸 데이터로 대체
- 자원이 없다면 본문으로 보낸 데이터로 생성
PATCH 요청
- 자원의 일부분 변경
안전 : 자원의 변경되지 않는지 멱등성( Idempotent ) : 여러번 요청을 보내도 첫 요청과 같은지 캐시 가능 : 응답 결과를 캐시해서 사용할 수 있는가?
응답 코드
- 2XX : 성공
- 200 OK : 요청 성공 ( GET )
- 201 Created : 요청 성공 , 새로운 자원이 생성됨 ( POST )
- 202 Accepted : 요청 성공 , 처리는 아직 미완료
- 204 NO Content : 요청 성공 , 응답할 데이터 없음
- 3XX : 리다이렉션 ( 이 요청을 처리하려면 추가적인 처리가 필요함 )
- 응답의 Location 헤더를 통해 특정 위치로 이동
- 4XX : 클라이언트 오류
- 401 Unauthorized : 미인증
- 403 Forbidden : 금지된 자원에 접근 ( 접근 권한이 없음 )
- 404 Not Found : 요청한 자원 없음 ( 공개한 자원 아님 )
- 5XX : 서버 오류
- 500 Internal Server Error : 서버 오류
- 503 Service Unavailable : 현재 이용 가능하지 않음
대표적인 헤더 정보
- Host : 요청 호스트에 대한 호스트명 + 포트 정보
- Date : 메세지 생성 시간
- Referer : 직전에 머물렀던 URL
- User-Agent : 클라이언트 소프트웨어 , 브라우저 명칭과 정보
- 디버깅 할 때 활용됨 : ex) 특정 브라우저에서 에러
- Server : 서버 소프트웨어 명칭과 정보
- Connection : keep-Alive 일 경우
킵 얼라이브
- Location : 리다이렉트시 이동할 경로
- Content-Type : HTTP 요청 및 응답에서 사용될 컴텐츠의 유형
- MIME 타입으로 명시 ( 표기법 )
- text/html; charset=utf-8 : HTML 문서 , 인코딩 형식은 utf-8
- application/json : JSON 형식 데이터 , API Request-Response에서 주로 사용
- image/png : png 타입 이미지 데이터
- text/plain; charset=utf-8 : 텍스트 파일 데이터 , 인코딩 형식은 utf-8
- application/xml : xml 데이터
- Content-Encoding : 데이터의 인코딩/압축 방식
- gzip : gzip 압축
- deflate : deflate 압축
- br : brotli 압축
identity
: 압축하지 않음
- Content-Length : 데이터의 바이트 단위 길이
- Content-Language : 데이터의 언어
- ko
- ko-KR
- en-US
HTTP 헤더 형식 header-field = field name ”:” field-value
- 메세지 전송에 필요한 부가 정보
Info
MIME
- Multiprupose Internet Mail Extensions
- 문서 , 파일 또는 바이트 집합의 성격과 형식을 나타냄
MIME 구조
- type / subtype
- 일반적으로
/
로 나눠진 두 부분으로 구성됨- type
- video , text 와 같은 데이터 타입이 속하는 일반 카테고리
- subtype
- plain , html , calendar etc
- 정확한 데이터 종류
[추가 정보](https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)
캐시
네트워크에서 캐시란?
- HTTP는 상태를 유지하지 않는다.
- 그렇다면 자원을 요청할 때마다 자원은 새롭게 응답될까?
네트워크에서 캐시
- 서버의 지연을 줄이기 위해 웹 페이지, 이미지 등의 자원 사본을 임시 저장하는 웹 기술
- 캐시된 자원이 저장되는 공간 : 클라이언트(브라우저) 혹은 특별한 서버 (캐시 서버 , 프록시 서버)
cache-control 헤더
- cache-control 헤더로 캐시 기능을 알린다
- cache-control : max-age = 숫자(초) 캐시한 자원의 지속 시간
- cache-control : no-cache 캐시 가능한 자원이나, 항상 origin 서버에 검증하기
- cache-control : no-store 캐시하면 안될 자원
Last-Modified 헤더
- 해당 자원이 언제 마지막으로 변경되었는지를 알림
클라이언트는 요청시 If-modified-since 헤더로 특정 시점 이후 자원 변경 여부를 묻는다. 만일 변경되었다면 다시 다운로드 만일 변경 되지 않았다면 서버는 304 Not Modified 응답을 보낸다.
Etag를 통해 자원의 변경 여부를 감지 할 수 있다 서버는 캐시된 자원이 Etag라는 식별 문자를 붙이고 (Etag 는 버전 ) 클라이언트는 If-Non-Match 헤더를 통해 해당 Etag가 변경되었는지를 물어본다
쿠키
- HTTP의 무상태성을 보완
- 서버로부터 받은 정보를 클라이언트 측(웹 브라우저)에 임시 저장되는 이름=값 형태의 데이터
- 유효 기간이 있음
- 쿠키를 전송할 도메인과 경로가 정해져 있음
쿠키(cooke) 확인
-
브라우저 → 개발자 도구 → Application → Storage → Cookies
-
서버가 Set-Cookie 헤더로 쿠키를 전달하면 클라이언트는 쿠키를 저장하여 다음 HTTP 요청의 Cookie 헤더로 활용한다.
-
Set-Cookie : domain=example.com
-
example.com 에 접근할 때 쿠키 활
경로를 나타 낼 때
- Set-Cookie : path=/
- path에 명시된 경로 하위 경로에서 쿠키 활용
- path=/posts
유효기간 설정
- Set-Cookie : expires=Wed, 10 Aug 2023 12:00:00 GMT
- 해당 날짜에 폐기
- Set-Cookie : max-age=1000
- 해당 횟수만큼 사용
쿠키는 보안에 민감하다 쿠키 정보를 탈취당하지 않도록 주의가 필요함
쿠키(Cookie)와 세션(Session) 쿠키의 저장/관리 주체가 클라이언트(브라우저) 세션의 저장/관리 주체는 서버
서버는 클라이언트를 식벼할 수 있는 세션 ID 를 제공하고, 클라이언트는 서버에게 세션 ID를 (쿠키로) 넘겨 호스트를 식별하게 할 수 있다
쿠키(Cookie)의 보안 기능
- Secure
- HTTPS인 경우에만 전송
- HTTPOnly
- 자바스크립트에서 접근 불가 (document.cookie)
- XSS 공격 방지