HTTP Request/Response 메시지 구조
HTTP 메시지는 웹에서 데이터를 전송하기 위해 사용되는 프로토콜인 HTTP(HyperText Transfer Protocol)에서 사용되는 메시지 구조이다.
HTTP 메시지는 데이터 통신을 위해 사용되며 Request와 Response 두 가지 형태로 나뉩니다.
1. HTTP Request(요청)
Start Line: 요청 메서드, URL 경로, 프로토콜 버전 등의 정보를 포함한다.
예: GET /index.html HTTP/1.1
Header Fields: 추가적인 메타데이터를 포함하는 헤더 필드들이 위치한다.
- General 헤더: Via(메시지 전달을 추적하고 요청 루프를 방지하며 요청/응답 체인에서 발신자의 프로토콜 기능을 식별하는 데 사용)와 같은 헤더는 메시지 전체에 적용
- Request 헤더: User-Agent (en-US), Accept-Type와 같은 헤더는 요청의 내용을 좀 더 구체화시키고(Accept-Language), 컨텍스를 제공하기도 하며(Referer), 조건에 따른 제약 사항을 가하기도 하면서(If-None) 요청 내용을 수정
- Entity 헤더: Content-Length(수신자에게 전송되는 메시지 본문의 크기)와 같은 헤더는 요청 본문에 적용됩니다. 당연히 요청 내에 본문이 없는 경우 entity 헤더는 전송되지 않음
Blank Line: 헤더와 본문(body) 사이를 나타내는 빈 줄이다.
Body: 요청의 본문으로, 필수는 아니며 데이터를 전송할 때 사용됩니다. 주로 POST 메서드와 함께 사용된다.
2. HTTP Response(응답)
Start Line: 상태 코드, 상태 메시지, 프로토콜 버전 등의 정보를 포함한다.
예: HTTP/1.1 200 OK
Header Fields: 추가적인 메타데이터를 포함하는 헤더 필드들이 위치한다.
- General 헤더: Via와 같은 헤더는 메시지 전체에 적용됨
- Response 헤더: Vary(응답 내용에 영향을 준 부분을 설명)와 Accept-Ranges(부분 요청의 지원을 알리기 위해 서버에 의해 사용) 같은 헤더는 상태 줄에 미처 들어가지 못했던 서버에 대한 추가 정보를 제공
- Entity 헤더: Content-Length와 같은 헤더는 요청 본문에 적용됩니다. 당연히 요청 내에 본문이 없는 경우 entity 헤더는 전송되지 않음
Blank Line: 헤더와 본문(body) 사이를 나타내는 빈 줄이다.
Body: 응답의 본문으로, 요청에 대한 실제 데이터가 들어간다. HTML, JSON, 이미지 등 다양한 형식의 데이터를 포함할 수 있다.
HTTP Method
HTTP Method는 HTTP에서 사용되는 요청 메서드이다. 클라이언트가 서버에게 요청을 전달할 때, HTTP 메서드를 사용하여 원하는 동작을 명시한다.
- GET: 서버에서 리소스(웹 페이지, 이미지, 동영상 등)를 읽어올 때 사용하는 메서드이다. 요청된 리소스를 가져와 응답으로 반환한다.
- POST: 서버에 데이터를 제출하고자 할 때 사용하는 메서드이다. 주로 HTML 폼 데이터를 서버로 전송하거나, 데이터를 생성하기 위해 사용된다.
- PUT: 서버에 리소스를 생성 또는 갱신하기 위해 사용하는 메서드이다. 요청된 리소스를 지정된 위치에 저장하거나, 해당 위치에 이미 존재하는 리소스를 갱신한다.
- DELETE: 서버에서 지정된 리소스를 삭제하기 위해 사용하는 메서드이다. 요청된 리소스를 삭제하고, 삭제 결과를 응답으로 반환한다. 다만, 보안 정책이나 리소스 유지를 위해 서버에서 DELETE를 거부할 수 있기에 항상 보장되지는 않는다고 한다.
- PATCH: 서버에서 리소스의 일부를 업데이트하기 위해 사용하는 메서드이다. 리소스의 부분적인 수정을 요청하며, 해당 리소스의 변경된 부분만을 전송한다.
- HEAD: GET 메서드와 유사하지만, 서버에서는 응답 본문(body)을 반환하지 않고 헤더 정보만을 반환한다. 주로 리소스의 메타데이터를 확인하여 존재 또는 수정 여부를 확인할 때 사용된다.
- OPTIONS: 서버에서 지원하는 HTTP 메서드의 목록을 요청하거나, 특정 리소스에 대한 허용되는 메서드 목록을 확인하기 위해 사용된다.
HTTP 메서드는 요청 메시지의 첫 번째 줄인 Start Line에서 지정된다.
예를 들어, GET /index.html HTTP/1.1과 같이 요청 메서드가 명시됩니다.
각각의 메서드는 특정한 동작을 나타내며, 서버는 해당 동작에 대한 적절한 응답을 반환합니다.
HTTP 정책 - CORS
CORS(Cross-Origin Resource Sharing)는 Same-Origin Policy라고도 알려져 있으며, 웹 애플리케이션에서 발생하는 보안 상의 이슈를 해결하기 위한 HTTP 정책이다.
기본적으로 웹 브라우저는 보안상의 이유로 스크립트를 사용하여 다른 도메인, 프로토콜 또는 포트에서 리소스에 접근하는 것을 제한한다.
CORS는 Same-Origin Policy를 우회하기 위해 추가적인 HTTP 헤더를 사용하여 브라우저가 리소스에 대한 Cross-Origin 요청을 허용할 수 있는 방법을 제공한다.
이를 통해 웹 애플리케이션이 다른 도메인의 리소스에 접근하고 상호 작용할 수 있다.
CORS 정책은 다음과 같은 요소들로 구성됩니다:
Origin: 클라이언트 웹 애플리케이션이 실행 중인 도메인, 프로토콜, 포트를 나타낸다.
Access-Control-Allow-Origin: 서버가 클라이언트의 요청을 허용하는 도메인을 응답으로 보내는 헤더이다. 이를 통해 클라이언트가 리소스에 접근할 수 있는 도메인을 지정할 수 있다.
Access-Control-Allow-Methods: 서버가 허용하는 요청 메서드의 목록을 응답으로 보내는 헤더이다. 이를 통해 클라이언트가 특정 동작을 수행할 수 있는 메서드를 알 수 있다.
Access-Control-Allow-Headers: 서버가 허용하는 요청 헤더 필드의 목록을 응답으로 보내는 헤더이다. 이를 통해 클라이언트가 특정 헤더를 사용할 수 있는지 여부를 확인할 수 있다.
Access-Control-Allow-Credentials: 서버가 클라이언트에서 쿠키 및 인증정보를 사용할 수 있는지 여부를 나타내는 헤더이다.
Preflight Request: 브라우저가 실제 요청을 보내기 전에 사전에 OPTIONS 메서드를 사용하여 서버에게 요청을 보내는 것을 말한다. 서버는 이 사전 요청에 대한 응답으로 CORS 정책과 관련된 헤더를 전송한다.
CORS 정책은 웹 애플리케이션에서 자바스크립트를 사용하여 다른 도메인의 리소스에 접근해야 할 때 중요하다.
서버 측에서 적절한 CORS 헤더를 설정하면 클라이언트에서 보안 정책에 따라 리소스에 안전하게 접근할 수 있게 된다.
서브넷팅 - 서브넷, 서브넷 마스크
서브넷팅(Subnetting)은 IP 네트워크를 더 작은 서브넷(Subnet)으로 분할하는 작업을 말한다.
이를 통해 네트워크 관리와 주소 할당을 효율적으로 수행할 수 있다.
서브넷(Subnet)은 IP 주소 범위를 나눈 작은 네트워크로 기본적으로 IP 네트워크는 네트워크 주소와 호스트 주소로 구성되는데, 서브넷팅을 통해 네트워크 주소 부분을 서브넷으로 분할하면서 더 많은 호스트 주소를 사용할 수 있다.
서브넷 마스크(Subnet Mask)는 IP 주소에서 네트워크 부분과 호스트 부분을 구분하는 역할을 한다. 서브넷 마스크는 32비트의 이진수로 표현되며, 일반적으로 CIDR(Classless Inter-Domain Routing) 표기법을 사용하여 표현된다. 예를 들어, 255.255.255.0은 24비트로 표현되는 서브넷 마스크이다.
서브넷 마스크는 IP 주소와 비트 연산을 수행하여 네트워크 주소와 호스트 주소를 결정한다. 네트워크 주소는 IP 주소와 서브넷 마스크를 AND 연산하여 얻을 수 있다. 호스트 주소는 네트워크 주소와 반대로 XOR 연산을 수행하여 얻을 수 있다.
즉, 1로 표현된 부분은 서브넷으로, 사용자에게 0이 표현된 부분만을 호스트 IP를 할당할 수 있게 만들겠다는 의미이다.
예를 들어, IP 주소가 192.168.1.0이고 서브넷 마스크가 255.255.255.0일 때, 이는 24비트로 표현된 서브넷 마스크이다.
이 경우, 네트워크 주소는 192.168.1.0이고, 호스트 주소는 0.0.0.255로 표현됩니다.
그럼 직접 또 다른 예로 만약 서브넷 마스크가 255.255.255.240이라면 이때 가능한 서브넷 네트워크의 수와 호스트 수를 계산해 보자.
240 = 11110000(2)이고, 1로 표현된 부분이 서브넷으로 표현할 수 있는 부분이므로 2^4 = 16개의 서브넷을 만들 수 있다.
0으로 표현된 부분이 호스트로 표현할 수 있는 부분이므로 2^4 = 16개의 호스트를 만들 수 있다. (네트워크 주소와 브로드캐스트 주소를 제외해야 하기에 사실상 14개)
서브넷팅을 수행할 때는 네트워크의 크기와 필요한 호스트 수에 따라 적절한 서브넷 마스크를 선택하고, 서브넷을 분할하여 네트워크를 관리한다. 이를 통해 IP 주소를 효율적으로 할당하고, 네트워크를 세분화하여 효율적인 트래픽 관리와 보안을 실현할 수 있다.
출처
'개발 > CS' 카테고리의 다른 글
(CS) 객체와 객체지향이란? (0) | 2023.12.19 |
---|---|
(CS) git (0) | 2023.07.31 |
(CS) HTTP, HTTPS, TCP (0) | 2023.05.19 |
(CS) OSI, TCP/IP Layer, TCP vs UDP (1) | 2023.05.12 |
(CS) 네트워크 기본 용어 정리 (0) | 2023.05.04 |