HTTP 통신은 클라이언트와 서버 간의 요청과 응답을 하는 과정이라고 했다.
이 때 서로 통신하는 packet
은 시작줄 , 헤더 , 개체 본문 (엔터티)가 존재한다.
HTTP 메시지는 HTTP 애플리케이션 간에 주고 받은 데이터의 블록들이다.
데이터 블록들은 주고 받은 데이터의 정보가 담긴 텍스트 메타 데이터와 엔터티가 존재한다.
메시지는 클라이언트, 서버, 프록시 사이를 흐르며 , 이 사이를 흐르는 움직임에 따라
인바운드 , 아웃바운드 , 업스트림, 다운스트림
으로 구분된다.
프록시
프록시란 클라이언트와 서버 사이에 존재하는 중계 역할 서버이다.
프록시는 클라이언트와 인터넷 사이에 존재하는forward proxy
, 서버와 인터넷 사이에 존재하는reverse proxy
가 존재한다.
프록시를 통해 클라이언트나 서버는 본인의 정보를 익명화 할 수 있으며, 프록시의 캐싱 기능을 통해 불필요하게 동일한 요청을 반복 할 필요가 없다.
메시지가 클라이언트에서 서버 방향으로 가는 트랜잭션 방향을 인바운드
서버에서 클라이언트 방향으로 가는 트랜잭션 방향을 아웃바운드
라고 한다.
또한 메시지는 다운스트림으로 흐른다.
요청 메시지, 응답 메시지에 관계 없이 모든 메시지는 다운 스트림으로 흐른다.
메시지의 발송자는 수신자의 업스트림이다.
이북을 캡쳐하는건 너무 양심에 찔려서 ..
클라이언트가 서버에게 보내는 요청 메소드와 서버가 클라이언트에게 보내는 상태 코드에 대해서만 가볍게 훑어보고 실제 예시들을 살펴보자
메소드 | 설명 | 본문 존재 유무 |
---|---|---|
GET | 서버에서 특정 리소스의 정보를 요청 | 없음 |
POST | 서버에 데이터를 제출하여 리소스의 상태를 변경하거나 처리 | 있음 |
PUT | 서버에 특정 리소스를 업데이트 | 있음 |
DELETE | 서버에서 특정 리소스를 삭제 | 없음 |
HEAD | GET 메소드와 유사하지만, 응답 본문을 포함하지 않음 | 없음 |
OPTIONS | 서버에서 지원되는 메소드를 확인하거나 서버의 기능을 확인 | 없음 |
PATCH | 리소스의 일부를 업데이트 | 있음 |
GET
가장 흔히 쓰이넨 메소드로 주로 서버에게 리소스를 달라고 요청하기 위해 사용된다.
GET
요청을 보내고 Host
정보와 리소스 경로
를 담아 요청하면
서버 측에서 응답 코드
가 담긴 헤더와 본문에는 해당 리소스를 담아 반응한다.
HEAD
HEAD
는 GET
요청과 비슷하지만 헤더만 올 뿐 본문은 결코 반환되지 않는다.
이를 통해 리소스를 가져오지 않고도 리소스가 서버에 존재하는지, 어떤 타입인지, 리소스가 변경 되었는지 등을 확인 할 수 있다.
PUT
PUT
은 클라이언트가 서버 측으로 문서를 쓰는 메소드이다.
요청 URL
은 HOST
주소에 해당 URL 리소스의 정보가 존재하지 않는다면 새로운 문서를 생성하고 , 존재한다면 덮어씌우는 역할을 한다.
POST
POST
메소드는 서버에 입력 데이터를 전송하기 위해 설계되었다.
실제로는 HTML
폼을 지원하기 위해 흔히 사용된다.
채워진 폼에 담긴 데이터는 서버로 전송되며 서버는 이를 모아서 필요로 하는 곳에 보낸다.
TRACE
주로 진단을 위해 사용되며 서버와 클라이언트는 다양한 프록시나 게이트웨이를 통과하며 연결 되어 있다.
TRACE
메시지는 클라이언트가 서버 측으로 보낸 메시지가 서버가 수신 되었을 때의 형태를 응답 받는다.
이를 통해 보낸 메시지가 어떻게 망가지거나 수정되었는지 확인 할 수 있다.
OPTION
웹 서버에게 여러가지 종류의 지원 범위에 대해 물어본다.
서버에게 특정 리소스에 대해 어떤 메소드가 지원되는지 물어 볼 수 있다.
DELETE
DLETE
는 요청 URL 을 호스트에게서 삭제 할 것을 요청한다.
상태 코드는 클라이언트에게 그들의 트랜잭션을 이해 할 수 있는 쉬운 방법을 제공한다.
상태 코드 | 사유 구절 | 의미 |
---|---|---|
100 | Continue | 클라이언트가 요청을 계속할 수 있음을 나타냅니다. |
101 | Switching Protocols | 서버가 프로토콜 변경을 요청한 클라이언트에게 응답하는 상태 코드입니다. |
102 | Processing | 요청이 수신되었으며, 서버는 처리 중이지만 응답을 아직 완료하지 않은 상태 코드입니다. |
상태코드 100은 클라이언트 애플리케이션이 서버에 엔터티 본문을 전송하기 전에 엔터티 본문을 서버가 받아들일 것인지 확인하려고 할 때, 그 확인 작업을 최적화 하기 위한 읟로 도입 되었다.
클라이언트와 100-continue
클라이언트가 서버 측에게 엔터티를 보내려고 하는 과정에서, 서버가 준비됐음을 확인하기 위해 클라이언트가 서버 측에게 100-continue
요청을 보낸다.
서버는 클라이언트 측에 요청에 맞춰 100-continue
요청에 대한 응답을 보낸다.
특별한 엔터티를 보내지 않을 것이라면 무의미한 100-continue
요청을 보내면 안된다.
서버측에서는 100-continue
요청을 받으면 엔터티를 받을 준비를 하고 있을 것이기 때문이다.
200-299
: 성공 상태 코드상태 코드 | 사유 구절 | 의미 |
---|---|---|
200 | OK | 요청이 성공적으로 처리되었음을 나타냅니다. |
201 | Created | 새로운 리소스가 성공적으로 생성되었음을 나타냅니다. |
202 | Accepted | 요청이 받아들여졌지만, 아직 처리되지 않았음을 나타냅니다. |
204 | No Content | 응답이 본문을 포함하지 않음을 나타냅니다. 주로 업데이트 후 응답이 필요 없는 경우에 사용됩니다. |
206 | Partial Content | 일부만 요청이 성공적으로 전송되었음을 나타냅니다. |
207 | Multi-Status | 다양한 상태 코드를 포함한 응답이 있음을 나타냅니다. |
208 | Already Reported | 리소스가 이미 이전 요청에서 보고되었음을 나타냅니다. |
226 | IM Used | 서버가 요청의 첫 번째 부분을 성공적으로 처리하였고, 리소스의 상태를 나타냅니다. |
300-399
: 리다이렉션 상태 코드 상태 코드 | 사유 구절 | 의미 |
---|---|---|
300 | Multiple Choices | 여러 리소스가 존재하고, 사용자 혹은 에이전트가 선택할 수 있음을 나타냅니다. |
301 | Moved Permanently | 요청한 리소스가 새로운 위치로 영구적으로 이동되었음을 나타냅니다. |
302 | Found | 요청한 리소스가 일시적으로 다른 위치로 이동되었음을 나타냅니다. (HTTP/1.0에서는 Moved Temporarily) |
303 | See Other | 리다이렉션 결과로 다른 URI를 참조하라는 의미를 나타냅니다. |
304 | Not Modified | 조건부 GET 요청에서 리소스가 수정되지 않았음을 나타냅니다. |
307 | Temporary Redirect | 요청한 리소스가 일시적으로 다른 위치로 이동되었음을 나타냅니다. (HTTP/1.1에서는 Temporary Redirect) |
308 | Permanent Redirect | 요청한 리소스가 영구적으로 다른 위치로 이동되었음을 나타냅니다. |
리다이렉션 상태 코드는 클라이언트가 관심 있어 하는 리로스에 대해 다른 위치를 사용하라고 말해주거나 리소스의 내용 대신 다른 대안 응답을 제공한다.
클라이언트가 찾는 리소스의 위치가 바뀐 경우 서버 측은 바뀐 리소스의 경로를 제공 할 수 있다.
또한 클라이언트가 찾는 리소스가 사실은 원본의 복사본일 경우, 해당 복사본이 원본ㄱ고가 버전이 같은지, 수정되었는지 등 또한 알 수 있다.
400-499
: 클라이언트 에러 상태 코드 가끔은 클라이언트는 서버가 다룰 수 없는 요청을 하곤 한다.
잘못된 요청이나 존재하지 않는 URL 에 대한 요청일 것이다.
이에 대해 서버는 다룰 수 없는 요청에 대해 에러 상태를 전달하고 , 브라우저는 에러 상태 코드에 맞춰 알아서 처리 할 것이다.
상태 코드 | 사유 구절 | 의미 |
---|---|---|
400 | Bad Request | 클라이언트의 요청이 부적절하거나 유효하지 않음을 나타냅니다. |
401 | Unauthorized | 인증이 필요한 리소스에 접근하려고 할 때, 유효한 인증 자격증명이 없음을 나타냅니다. |
403 | Forbidden | 클라이언트가 요청한 리소스에 접근할 권한이 없음을 나타냅니다. |
404 | Not Found | 요청한 리소스를 서버에서 찾을 수 없음을 나타냅니다. |
405 | Method Not Allowed | 클라이언트가 허용되지 않는 메서드로 리소스에 접근하려고 할 때 나타납니다. |
429 | Too Many Requests | 클라이언트가 일정 시간 동안 너무 많은 요청을 보낸 경우를 나타냅니다. |
500-599
: 서버 에러 상태 코드 때로는 클라이언트의 올바른 요청을 보냈음에도 서버 자체에서 에러가 발생하는 경우도 있다.
프록시는 클라이언트의 입장에서 서버와 대화를 시도 할 때 자주 에러를 만난다.
상태 코드 | 사유 구절 | 의미 |
---|---|---|
500 | Internal Server Error | 서버에서 요청을 처리하는 동안 예상치 못한 오류가 발생함을 나타냅니다. |
501 | Not Implemented | 서버가 요청한 기능을 수행할 수 없음을 나타냅니다. |
502 | Bad Gateway | 게이트웨이나 프록시 서버가 서버로부터 유효하지 않은 응답을 받았음을 나타냅니다. |
503 | Service Unavailable | 서버가 현재 요청을 처리할 수 없음을 나타냅니다. 이는 일시적인 상태일 수 있습니다. |
504 | Gateway Timeout | 게이트웨이나 프록시 서버가 서버로부터 제때 응답을 받지 못했음을 나타냅니다. |
505 | HTTP Version Not Supported | 서버가 요청에 사용된 HTTP 프로토콜 버전을 지원하지 않음을 나타냅니다. |
메시지는 시작줄, 헤더, 본문 (엔터티) 로 나뉜다.
예시를 통해 살펴보자
네이버에서 해당 증시 이미지를 가져오는 요청을 살펴보자
개발자 관리 도구 - 네트워크
에서 확인 할 수 있는데 여기서 request Headers
를 살펴보도록 하겠다.
항목 | 값 | 의미 |
---|---|---|
Request URL | https://ssl.pstatic.net/imgfinance/chart/mobile/mini/KOSDAQ_naverpc_l.png | 요청한 자원의 URL |
Request Method | GET | HTTP 메서드로, 서버에게 자원을 요청하는 방법 |
Status Code | 200 OK | 서버의 응답 상태 코드로, 요청이 성공했음을 나타냄 |
Remote Address | 43.250.152.47:443 | 서버의 원격 주소 및 포트 번호 |
Referrer Policy | origin | 리퍼러 헤더를 어떻게 처리할지를 나타내는 정책 |
일반적 헤더는 HTTP 메시지의 전반적인 내용이 모두 담긴 헤더들로 응답 , 요청자 모두에게 적용 가능하다.
해당 증시 이미지를 가져오기 위해 GET
요청을 보냈고, 서버 측에게 응답으로 200 ok
를 받은 모습을 볼 수 있다.
응답 코드에 대해서는 추후 자세히 다룬다.
헤더 | 값 (예시) | 의미 |
---|---|---|
:authority | ssl.pstatic.net | 서버의 호스트명을 나타냅니다. |
:method | GET | 사용된 HTTP 메서드를 나타냅니다. |
:path | /imgfinance/chart/mobile/mini/KOSDAQ_naverpc_l.png | 요청한 자원의 경로를 나타냅니다. |
:scheme | https | 사용된 프로토콜 스킴을 나타냅니다 (여기서는 HTTPS). |
Accept | image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 | 클라이언트가 받아들일 수 있는 미디어 타입을 나타냅니다. |
Accept-Encoding | gzip, deflate, br | 클라이언트가 지원하는 데이터 인코딩 방법을 나타냅니다. |
Accept-Language | ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 | 응답에 대한 우선적인 언어를 나타냅니다. |
If-Modified-Since | Tue, 19 Dec 2023 03:35:18 GMT | 수정 시간을 기반으로 자원을 조건적으로 요청합니다. |
If-None-Match | "12a1-60cd48e2a4980" | 엔터티 태그를 기반으로 자원을 조건적으로 요청합니다. |
Referer | https://www.naver.com/ | 현재 요청된 리소스에 대한 이전 웹 페이지의 참조 주소를 나타냅니다. |
Sec-Ch-Ua | "Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120" | 사용자 에이전트에 대한 정보를 나타냅니다. |
Sec-Ch-Ua-Mobile | ?0 | 사용자 에이전트가 모바일 디바이스인지를 나타냅니다. |
Sec-Ch-Ua-Platform | "Windows" | 사용자 에이전트의 플랫폼 정보를 나타냅니다. |
Sec-Fetch-Dest | image | 요청의 대상이 되는 리소스의 종류를 나타냅니다. |
Sec-Fetch-Mode | no-cors | 리소스를 가져오는 모드를 나타냅니다. |
Sec-Fetch-Site | cross-site | 요청의 대상이 되는 사이트의 종류를 나타냅니다. |
User-Agent | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 | 사용자 에이전트 및 플랫폼 정보를 나타냅니다. |
헤더 | 값 (예시) | 의미 |
---|---|---|
Accept-Ranges | bytes | 서버가 지원하는 리소스의 범위 단위를 나타냅니다. |
Access-Control-Allow-Origin | * | 클라이언트에게 응답 리소스에 접근할 권한을 부여하는 출처을 나타냅니다. |
Age | 33 | 리소스가 얼마나 오래된 것인지를 나타냅니다 (초 단위). |
Cache-Control | max-age=60 | 캐시 동작을 지정하며, 최대 캐시 유지 시간을 나타냅니다 (초 단위). |
Content-Length | 4836 | 응답 본문의 크기를 바이트 단위로 나타냅니다. |
Content-Type | image/png | 응답 본문의 미디어 타입을 나타냅니다. |
Date | Tue, 19 Dec 2023 03:42:31 GMT | 응답이 생성된 날짜와 시간을 나타냅니다. |
Etag | "12e4-60cd4a4568e80" | 리소스의 엔터티 태그를 나타내며, 리소스가 어떻게 변경되었는지를 식별합니다. |
Expires | Tue, 19 Dec 2023 03:43:31 GMT | 응답이 만료되는 날짜와 시간을 나타냅니다. |
Last-Modified | Tue, 19 Dec 2023 03:41:30 GMT | 리소스가 마지막으로 수정된 날짜와 시간을 나타냅니다. |
Server | Testa/6.1.4 | 응답을 생성한 서버의 소프트웨어 및 버전을 나타냅니다. |
Strict-Transport-Security | max-age=31536000 | HTTPS를 통해 통신하는 동안 클라이언트가 지켜야 하는 보안 정책을 나타냅니다. |
헤더가 하나하나 무엇을 의미하는지 암기하려고 해도 못할 것 같으니
이런게 있구나 하고 넘어간 다음 필요 할 때마다 찾아야겠다.