# HTTP
## 의미
HyperText Transfer Protocol
웹 상에서 정보를 교환할 때 주로 쓰이는 프로토콜이다.
## 특징
- TCP/IP 기반
- 패킷 단위 통신
- 클라이언트 - 서버 모델을 따름
- 80번 포트 사용
### Connectionless 비연결지향
- 서버에 가는 부담을 줄이기 위해 응답 받은 후 연결 해제
- 요청 시마다 연결하면 오버헤드가 발생하므로 `connection:keep-alive` 속성을 사용해 지속적 연결 상태를 유지(기존 연결을 재사용)
### Stateless 무상태성
- 서버가 클라이언트의 정보를 저장하지 않고 각 요청을 독립적으로 처리
- 클라이언트에 맞춰 응답이 불가능하므로 이를 해결하기 위해 쿠키, 세션 등을 사용
## 메서드
- GET
- POST
- PUT
- DELETE
...
### 멱등성
같은 요청을 여러 번 보내도 같은 효과를 지님
GET,PUT,DELETE 등
### 안전성
서버의 상태를 바꾸지 않음(읽기)
모든 안전한 메서드는 멱등성을 가짐
GET 등
### 캐시
사설 캐시/공유 캐시
## 상태 코드
- 2xx 성공
- 3xx 리다이렉션
- 4xx 클라이언트 오류
- 5xx 서버 오류
### 문제점
- 평문 통신이어서 가로챌 수 있다
- 통신 상대를 확인하지 않아 위장 가능
- 응답해도 되는 요청인지 알 수 없다
- 누가 요청했는지 알 수 없다
- 변조 가능
## HTTPS
- 위와 같은 문제로 인해 암호화하여 전송하는 프로토콜
- 443번 포트 사용
- SSL을 한번 더 거쳐 통신(HTTP↔SSL↔TCP)
- 공개키 암호화 방식
- CA 기업에게 돈을 지불하고 인증서 발급
### 단점
- HTTP에 비해 많은 리소스 필요
- 인증서 유지보수 비용 필요
## 요청과 응답
<!--  -->

### 요청
#### 요청
`<request_method><URL><HTTP_Ver>`
#### 헤더
- host : 서버 도메인+포트번호
- Content-Type : body type
- If-Modified-Since : 명시 날짜 이후 변경된 리소스만 획득
- Cookie : Set-cookie 설정된 쿠키값
### 응답
#### 응답 헤더
- Access-Control-Allow-Origin: : CORS를 허용하기 위한 주소 명시
- Set-cookie : 클라이언트에 쿠키 설정
- Location : 3xx 상태일 때 리다이렉션 되는 주소
- Allow : 허용 메서드