# HTTP
## 개요
HTTP는 인터넷에서 정보를 주고받기 위한 표준 프로토콜이다.
즉 Hypertext인 HTML을 전송하기 위한 통신규약을 의미
***
## 특징
### 1. Connectionless 프로토콜 (비연결성 지향)
클라이언트가 서버에 요청했을 때, 그 요청에 맞는 응답을 보낸 후 **연결을 끊는다**.
HTTP은 TCP를 기반하여 구현되었기 때문에 "연결 지향"이라고 볼 수도 있지만, 네트워크 관점에서 `keep-alive` 옵션으로 선택할 수 있다는 점과 서버 측에서 비 연결 지향적인 특성을 이용해 연결(connection)을 관리하는 함으로서 장점을 갖는다는 점에서 "비연결 지향"으로 이해한다.
예외로 HTTP/1.1 버전에서는 connection을 유지하고 요청을 재활용하는 기능이 있다 (keep-alive)
### 2. Stateless 프로토콜
connection을 끊는 순간 클라이언트와 서버의 통신이 끝나고 **서버는 사용자의 상태 정보를 유지하지 않는다**. 이전에 했던 통신에서 데이터를 주고 받았어도 이후의 통신에서는 이전의 데이터를 유지하지 않는다. 그러나 데이터 유지가 필요한 경우가 있기에 [[Cookie, Session, Cache#Cookie|쿠키]]와 [[Cookie, Session, Cache#Session|세션]]을 사용한다.
***
## HTTP 메서드
| 메소드 | Cisco DNA에서 사용 | 일반 HTTP 사용 | 설명 |
| ----------- | -------------- | ---------- | ------------------ |
| **GET** | ✅ 사용함 | ✅ 사용함 | 리소스 조회 |
| **POST** | ✅ 사용함 | ✅ 사용함 | 리소스 생성 |
| **PUT** | ✅ 사용함 | ✅ 사용함 | 리소스 전체 수정 |
| **PATCH** | ✅ 사용함 | ✅ 사용함 | 리소스 일부 수정 |
| **DELETE** | ✅ 사용함 | ✅ 사용함 | 리소스 삭제 |
| **HEAD** | ❌ 거의 사용 안함 | ✅ 사용함 | 본문 없이 헤더만 조회 |
| **OPTIONS** | ⚠️ 제한적 사용 | ✅ 사용함 | 지원 메소드 조회 (CORS 등) |
| 메소드 | 설명 |
| ----------- | ------------------ |
| **GET** | 리소스 조회 |
| **POST** | 리소스 생성 |
| **PUT** | 리소스 전체 수정 |
| **PATCH** | 리소스 일부 수정 |
| **DELETE** | 리소스 삭제 |
| **HEAD** | 본문 없이 헤더만 조회 |
| **OPTIONS** | 지원 메소드 조회 (CORS 등) |
***
## HTTP 상태코드
| 상태 코드 | 이름 | 설명 |
| ------- | --------------------- | -------------- |
| **200** | OK | 요청 성공 |
| **201** | Created | POST 성공 |
| **202** | Accepted | 비동기 처리 수락 |
| **204** | No Content | DELETE 등에서 사용 |
| **400** | Bad Request | 잘못된 요청 |
| **401** | Unauthorized | 인증 실패 |
| **403** | Forbidden | 권한 없음 |
| **404** | Not Found | 리소스 없음 |
| **409** | Conflict | 리소스 충돌 (예: 중복) |
| **500** | Internal Server Error | 서버 오류 |
| **503** | Service Unavailable | 서비스 일시 중단 |
| 상태 코드 | 이름 | Cisco DNA 사용 여부 | 설명 |
| ------- | --------------------- | --------------- | -------------- |
| **200** | OK | ✅ | 요청 성공 |
| **201** | Created | ✅ | POST 성공 |
| **202** | Accepted | ✅ | 비동기 처리 수락 |
| **204** | No Content | ✅ | DELETE 등에서 사용 |
| **400** | Bad Request | ✅ | 잘못된 요청 |
| **401** | Unauthorized | ✅ | 인증 실패 |
| **403** | Forbidden | ✅ | 권한 없음 |
| **404** | Not Found | ✅ | 리소스 없음 |
| **409** | Conflict | ✅ | 리소스 충돌 (예: 중복) |
| **500** | Internal Server Error | ✅ | 서버 오류 |
| **503** | Service Unavailable | ✅ | 서비스 일시 중단 |
1xx (informational - 정보성 응답)
* 100 continue: 서버가 클라이언트의 요청을 받아들여 추가 정보를 보내달라는 의미
2xx (Successful - 성공적인 응답)
* 200 OK: 요청이 성공적으로 처리되었다는 의미
* 201 Created: 요청이 성공적으로 처리되었고 새로운 리소스가 생성됨
* 204 Not Content
3xx (Redirection - 리디렉션)
* 301 Moved Permanently
* 302 Found: 요청한 리소스가 다른 위치에 있음을 나타냄
* 304 Not Modified: 클라이언트의 캐시된 버전이 최신임을 서버에 알려줌
4xx (Client Error - 클라이언트 오류):
* 400 Bad Request: 요청이 잘못되었거나 서버가 이해할 수 없는 요청
* 401 Unauthorized: 인증이 필요함
* 404 Not Found: 요청한 리소스를 찾을 수 없음
5xx (Server Error - 서버 오류):
* 500 Internal Server Error
* 503 Service Unavailable: 서버가 일시적으로 요청을 처리할 수 없음
***
## HTTP 구조
### HTTP Request/response
#### Header
- Host: 요청을 보내는 클라이언트가 알고 있는 서버의 호스트명 또는 IP 주소
- User-Agent: 클라이언트 애플리케이션의 정보 (브라우저 정보 등)
- Accept: 클라이언트가 처리할 수 있는 MIME 타입 목록
- Accept-Language: 클라이언트가 선호하는 자연 언어 목록
- Accept-Encoding: 클라이언트가 선호하는 압축 인코딩 형식 목록
- Connection: 클라이언트가 선호하는 연결 옵션
- Content-Type: 요청 본문의 MIME 타입
- Content-Length: 요청 본문의 길이
#### Body
#작성중
***
## 설명
브라우저와 서버는 HTTP를 이용해서 통신할 수 있다. 인터넷을 통한 업로드, 다운로드, 이미지, 문서 모든 것들에서 HTTP는 빠질 수 없다.
예를 들어, youtube에 접속할 때 브라우저를 통해 youtube Server로 HTTP를 통해서 request를 보낸다. youtube Server는 나의 request를 통해 요구하는 것을 파악 후 해당하는 데이터를 HTTP response로 나의 브라우저에 보내준다.
여기서 포인트는 **리얼타임(실시간 반영)이 아니라는 것이다**. 내가 request를 보내면 그 후 response로 응답을 받을 수 있다는 것이다.
이러한 HTTP 통신의 특징으로 채팅 서비스를 구축한다면 큰 문제가 생긴다. 내가 상대방에게 메세지를 보낸 후 상대방의 응답을 확인하기 위해서 새로 고침을 계속해서 해야 한다는 점이다.
채팅 서비스, 주식 서비스 같은 경우는 전화 통화처럼 실시간으로 연결되어 있어야 한다. 이러한 조건을 만족 시키기 위해 HTTP 대신 WebSocket을 이용한다
***
## 시나리오
클라이언트가 무선 통신으로 `https://www.example.com`에 접속하려고 한다.
[[Open Wireless Network]] (Public WiFi Free와 같은 네트워크)를 사용한다고 가정하자.
### 전체적인 흐름
1. 사용자 요청
* 주소창에 `https://www.example.com`를 입력
* DNS 질의 발생 (보통 UDP 53)
* `https://www.example.com`의 IP를 알려 달라는 요청을 보냄
* 이 요청은 평문으로 요청 된다.
2. DNS 응답 수신
* `example.com`의 IP 획득
* 응답 또한 평문으로 응답받는다
* DNS over HTTPS (DoH) 또는 DNS over TLS (DoT)를 사용하면 방지 가능
3. TCP 연결
* TCP 3-way 핸드셰이크를 통해 클라이언트와 `example.com` 서버 간의 TCP 연결이 수립이 진행된다 (Port 443)
* 이 과정도 평문으로 전송됨
4. TLS hand shake 완료
5. HTTPS 요청/응답
* 클라이언트가 TLS 세션 내에서 암호화된 HTTP GET 요청을 보낸다
* 서버는 응답을 암호화하여 전송한다
---
## 링크
참고 링크
https://www.youtube.com/watch?v=5EhsjtBE7I4
***