HTTP는 WWW에서 브라우저와 서버 간 데이터를 주고받기 위한 통신 프로토콜입니다. 웹에서 텍스트, 이미지, 동영상 등 다양한 리소스를 요청하고 전달받는 데 사용됨
데이터의 형식에 구애받지 않고 애플리케이션의 다양한 자원을 네트워크를 통해 송수신하는 것
HTTP는 기본적으로 요청 메세지를 보내는 보내는 클라이언트와 이에 대해 응답 메세지를 보내는 서버가 서로 요청/응답 멧지를 주고받는 구조로 작동
HTTP는 주고받을 자원의 특성과 무관하게 자원을 주고받는 수단(인터페이스)의 역할만 수행. 예를 들어 (HTML, JPEG, PNG, JSON, XML, PDF) 등 다양한 자원을 주고받을 수 있음
서버는 HTTP요청을 보낸 클라이언트 관련 상태를 기억하지 않기 때문에 클라이언트의 모든 HTTP요청은 기본적으로 독립적인 요청으로 간주됨

1997년에 등장한 HTTP의 표준으로, 현재까지도 널리 사용됨
Connection: keep-aliveCache-control, 'ETag'같은 헤더를 통해 클라이언트와 서버 간 데이터 캐싱을 지원함Host 헤더를 요구함2015년에 표준화된 버전으로, 성능 개선에 초점을 맞추고 있음
더 빠른 데이터 전송과 네트워크 자원 활용
지연 시간 감소

HTTP/2의 성능 문제를 개선하고자 개발된 최신 프로토콜. QUIC(Quick UDP Internet Connections)를 기반으로 함


HTTP파이프라이닝은 HTTP/1.1에서 등장한 기술로, 하나의 TCP연결을 통해 클라이언트가 다수의 요청을 연속적으로 전송할 수 있게 하는 방식
보안 계층이 QUIC 프로토콜에 내장되어 있어 별도의 과정 없이 보안 연결이 이루어집니다. 이전 세션에서 세션 키를 재사용할 수 있는 경우, 서버와 클라이언트는 핸드셰이크 없이 바로 데이터를 전송할 수 있습니다. 핸드셰이크와 암호화가 프로토콜 수준에서 함께 처리됩니다.
1) Client Hello : 클라이언트에서 서버로 요청 보냄. 클라이언트의 암호화 알고리즘 지원 목록과 난수 전달
2) Server Hello : 서버가 암호화 알고리즘을 선택하고 자신의 인증서와 난수를 전달
3) Key Exchange & Finished Messages : 클라이언트와 서버가 서로 암호화 키를 교환하고 세션 키를 생성. 이후 클라이언트가 데이터를 암호화해 전송
1) Client Hello : 클라이언트가 초기 연결 요청과 함께 자신의 지원 알고리즘 목록, 난수, 초기 암호화 데이터 전송. 이전 세션에서 공유한 세션 키를 포함
2) Server Hello & Encrypted Extensions : 서버가 암호화 알고리즘을 선택하고 세션 키를 생성. 이후 암호화된 데이터를 즉시 교환
3) 데이터 전송 시작 : 서버와 클라이언트는 세션 키를 통해 데이터를 바로 전송



HTTP의 메세지는 기본적으로 시작라인, 필드라인, 메세지 본문으로 구성됨. 필드 라인은 여러 개가 존재할 수 있고, 메세지 본문은 없을 수도 있음.

클라이언트가 서버에 작업을 요청하는 메세지
서버가 클라이언트 요청에 대해 처리 결과를 전달하는 메세지
GET /index.html HTTP/1.1HTTP/1.1 200 OK와 함께 HTML문서를 전달HTTP 헤더는 응답 메세지에 포함되어 추가 정보를 제공하는데 사용됨. HTTP헤더는 크게 다음 4가지 종류로 나뉜다
요청과 응답에 모두 사용되며, 메세지에 대한 일반 정보를 제공함
Cache-control: no-cacheConnection: keep-aliveDate: Tue, 10 Dec 2024 10:30:00 GMT클라이언트가 서버에 요청을 보낼 때 추가 정보를 포함함
Host: www.example.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)Accept: text/html, application/jsonAuthorization: Bearer <token>서버가 클라이언트에 응답할 때 메세지와 관련된 정보를 포함함
Server: Apache/2.4.41 (Ubuntu)Location: https://example/new-pageRetry-after: 120요청이나 응답 본문(Entity body)과 관련된 정보를 제공
Content-Length: 348Content-Encoding: gZipLast-Modeified: Mon, 09 Dec 2024 15:45:00 GMTHTTP Keep-alive
HTTP 연결을 지속적으로 유지하며, 여러 개의 요청을 한 번의 연결로 처리할 수 있게 하는 기능. 기본적으로 HTTP는 각 요청마다 새로운 연결을 맺고, 요청을 처리한 후 연결을 끊음. 하지만 Keep-Alive를 사용하면, 클라이언트와 서버 간의 연결을 여러 요청에 대해 재사용할 수 있음. 이로 인해 성능이 개선되고, 연결을 생성하는 데 드는 오버헤드를 줄일 수 있음
| HTTP 메서드 | 설명 |
|---|---|
| GET | 자원을 습득하기 위한 메서드 |
| HEAD | GET과 동일하나, 헤더만을 응답받는 메서드 |
| POST | 서버로 하여금 특정 작업을 처리하게끔 하는 메서드 |
| PUT | 자원을 대체하기 위한 메서드 |
| PATCH | 자원에 대한 부분적 수정을 위한 메서드 |
| DELETE | 자원을 삭제하기 위한 메서드 |
| CONNECT | 자원에 대한 양방향 연결을 시작하는 메서드 |
| OPTIONS | 사용 가능한 메서드 등 통신 옵션을 확인하는 메서드 |
| TRACE | 자원에 대한 루프백 테스트를 수행하는 메서드 |
가장 흔히 사용하는 메서드 중 하나로, 자원을 조회하는 용도의 메서드. 웹 브라우저를 통한 웹 페이지 조회는 웹 브라우저의 GET 요청 메세지에 대한 응답을 의미

응답 메세지에 메세지 본문이 표시되지 않는다는 점을 제외하면 사실상 GET 메서드와 동일
서버로 하여금 특정 작업을 처리하도록 하는 용도로 사용. 많은 경우에 클라이언트가 서버에 새로운 자원을 생성하고자 할 때 사용.
GET 메서드와 다른 점은 Message body가 같이 전달된다

PUT메서드가 덮어쓰기를 요청하는 메서드인 반면 PATCH메서드는 부분적 수정을 요청하는 메서드이다

DELETE 메서드는 특정 자원의 삭제를 요청할 때 사용하는 메서드
상태 코드 : 요청의 결과를 나타내는 3자리의 정수. 이들 중 200번대부터 500번대가 자주 사용하는 상태 코드에 해당됨.
| 상태 코드 | 설명 |
|---|---|
| 100번대(100 ~ 199) | 정보성 상태 코드 |
| 200번대(200 ~ 299) | 성공 상태 코드 |
| 300번대(300 ~ 399) | 리다이렉트 상태 코드 |
| 400번대(400 ~ 499) | 클라이언트 에러 상태 코드 |
| 500번대(500 ~ 599) | 서버 에러 상태 코드 |
| 상태 코드 | 이유 구문 | 설명 |
|---|---|---|
| 200 | OK | 요청이 성공했음 |
| 201 | Created | 요청이 성공했으며, 새로운 자원이 생성되었음 |
| 202 | Accepted | 요청을 잘 받았으나, 아직 요청한 작업이 끝나지 않았음 |
| 203 | No Content | 요청이 성공했지만, 메세지 본문으로 표시할 데이터가 없음 |
리다이렉션(Redirection)이란 클라이언트가 요청한 자원이 다른 곳에 있을 때 다른 곳으로 요청을 이동시키는 것을 의미. 클라이언트가 요청한 자원이 다른 URL에 있을 경우, 서버는 리다이렉션 상태 코드와 함께 응답 메세지의 Location 헤더를 통해 요청한 자원이 위치한 URL을 안내해줄 수 있음. 이를 수신한 클라이언트는 Location 헤더에 명시된 URL로 재요청을 보내 새로운 URL에 대한 응답을 받게 된다.

영구적 리다이렉션은 자원이 완전히 새로운 곳으로 이동하여 경로가 영구적으로 재지정되는 것을 의미. 자원의 위치가 영구적으로 변경되었음을 시사하므로, 기존 URL에 요청 메세지를 보내면 항상 새로운 URL로 리다이렉트됨.
일시적 리다이렉션은 자원의 위치가 임시로 변경되었거나 임시로 사용할 URL이 필요할 경우에 주로 사용.
303(Moved Permanently)과 308(Permanent Redirect), 그리고 302(Found)와 303(See Other), 307(Temporary Redirect)은 재요청 메서드가 어떻게 변경되는지에 따라 구분할 수 있음
| 상태 코드 | 이유 구문 | 설명 |
|---|---|---|
| 301 | Moved Permanently | 영구적 리다이렉션 - 재요청 메서드가 변경될 수 있음 |
| 308 | Permanent Redirect | 영구적 리다이렉션 - 재요청 메서드가 변경되지 않음 |
| 302 | Found | 일시적 리다이렉션 - 재요청 메서드가 변경될 수 있음 |
| 303 | See Other | 일시적 리다이렉션 - 재요청 메서드가 GET으로 변경됨 |
| 307 | Temporary Redirect | 일시적 리다이렉션 - 재요청 메서드가 변경되지 않음 |
| 304 | Not Modified | 캐시 - 자원이 변경되지 않음 |
400번대 에러 코드는 '클라이언트에게 잘못이 있음'을 나타내는 상태 코드이다
| 상태 코드 | 이유 구문 | 설명 |
|---|---|---|
| 400 | Bad Request | 요청 메세지의 내용이나 형식 자체에 문제가 있음 |
| 401 | Unauthorized | 요청한 자원에 대한 유효한 인증이 없음 |
| 403 | Forbidden | 요청이 서버에 의해 거부됨(예: 자원에 대한 접근 권한이 충분하지 않음) |
| 404 | Not Found | 요청받은 자원을 찾을 수 없음 |
| 405 | Method Not Allowed | 요청한 메서드를 지원하지 않음 |
500번대 상태 코드는 '서버에게 잘못이 있음'을 나타내는 상태 코드이다
사실 500번대 상태 코드의 대부분은 '요청을 처리할 수 없음'을 나타내는 500이다. 서버에 어떤 문제가 발생했을 때 익명의 다수 사용자에게 오류 원인을 상세히 공개하는 것은 보안상 좋지 않이 때문에 보통 서버 문제를 가리키는 상태 코드를 500으로 통칭하는 경우가 많다.
| 상태 코드 | 이유 구문 | 설명 |
|---|---|---|
| 500 | Internal Server Error | 요청을 처리할 수 없음 |
| 502 | Bad Gateway | 중간 서버의 통신 오류 |