HTTP요청이 생기면 브라우저는 이에대한 HTTP 요청메세지를 생성, TCP/IP 프로토콜을 활용해 웹서버에 요청한뒤 브라우저는 웹 서버로부터 HTTP 응답을 받는다. (전송계층 프로토콜 - TCP, 네트워크 계층 프로토콜 - IP)
그리고 이것에 대한 간단한 머릿글의 형태로 받는것이 헤더이다. (헤더인증, 캐싱, 쿠키, 보안등 다양한 종류가 있다)
여담으로 TCP/IP의 경우 인증, 보안부분에서 취약하고 한다 (암호화가 된경우 암호화의 의미는 몰라도 암호화된 메세지 자체는 엿볼수 있으며 이를 막기위한 방법이 SSL,TLS이다)
HTTP(Hyper Text Transfer Protocol)
HTML문서와 리소스를 가져올수 있도록 하는 프로토콜로 웹 브라우저와 웹 서버간 통신을 목적으로 만들어졌다. (HTTP헤더는 대소문자를 구분하지 않는 이름과 콜론(:) 다음에 오는 값(줄 바꿈 없이) 이뤄져있으며 값 앞에 붙은 빈 문자열은 무시된다.
헤더(header)
- 주로 데이터가 저장되거나 전송되는 데이터 블록의 맨 앞에 위치한 보충 데이터 (머릿글, 제목, 서론같은 개념이며 헤더 뒤에 이어지는 데이터는 페이로드 또는 바디라 불린다.)
- 데이터 블록은 하단과 같으며 헤더는 데이터 블록 최상단에 위치하고있다. (우리가 사용하는 통신의 바디값은 데이터 계층에 존재하며 특정 프로토콜의 헤더 내용은 특정 프로토콜의 기능을 제공하기 위한 정보를 담고있다.)
- HTTP헤더는 HTTP메세지(요청/응답)와 본문에 대한 정보를 말해주는데 해당 메세지가 제공하는 기능에 대한 최소한의 정보가 정리되는 요약본이다. (쉽게말해 머릿글 같은것) -> 만일 불필요한 내용을 담을경우 데이터 크기가 커져 빠른 전송이 불가능하기에 꼭 필요한 내용만 담는다.
- 평문(암호화를 하지 않은) 통신이기에 도청이 가능하며 통신 상대방을 확인하지 않아 위장이가능하다. (TCP/IP자체가 통신 경로의 도중에 엿볼수 있다는 단점이 있다)

헤더의 분류
프록시 처리 방법에 따른 분류
- 요청 속도를 올리기 위하여 중간에 대체자(Proxy)를 두고 캐시하여 사용하는 방법이다
- 종단간 헤더 (end-to-end) - 메세지의 최종 수신자에게 전송되어야 하며 중간 프록시는 반드시 종단간 헤더 원상태를 재전송하며 캐시는 이를 저장해야한다.
- 홉간 헤더 (hop-by-hop) - 단일 전송 - 레벨 연결에서만 의미있으며 프록시에 의해 재전송,캐시가 되어선 안된다.

헤더는 크게 4가지로 나눌수 있다. (개발자 도구를 키면서 보기를 권장한다..)
1. General header: 요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더.
- Data(헤더 생성시점), Connection등 일반적인 정보가 포함된다.
- Connection : 클라이언트와 서버의 연결방식(전송 후 네트워크 연결 유지여부)을 설정하는것이며 Http/1.1은 keep-alive(연결유지)가 디폴트이다 (프록시에 더이상 전송되지 않는 헤드필더(hop-by-hop)를 지정)
2. Request header (응답 헤더): 패치될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더.
- 웹브라우저가 서버에 요청하는것을 텍스트로 변환한 메세지
- 응답에 대한 부가정보 및 콘텐츠에 대한 우선순위등 (Authorization이 여기 포함)
3. Response header (요청 헤더): 클라이언트 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더.
- 웹브라우저가 요청한 메세지에 대한 status 메세지
4. Entity header : 콘텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더.
- 엔티티 바디 정보로 실제로 주고받는 컨텐츠 타입 또는 길이 같은 메세지 바디에 들어가는 내용에 관한 헤더가 들어가는 헤더
- Content-Encoding - 미디어 타입을 압축하기 위해 사용되며 이것을 통해 클라이언트는 본문의 압축방식을 알수있다.
- 미디어 타입 (MIME Type(구), media type) - 파일의 형식을 나타내는 문자열로 파일과 같이 송신될때 Content의 형식을 나타내기 위하여 사용 (Audio/ogg는 오디오파일로, image/png는 그림파일로 분류하며 특정한 타입이 없는 바이너리 타입은 application/..으로 나타난다)

HTTP 헤더의 특성
1. 비연결성(connectionless)
- 클라이언트와 서버가 연결을 맺은후 응답이 끝나면 기존의 연결을 끊는것 (단발적인 연결)
- HTTP가 계속 연결되면 서버는 다수의 클라이언트(유저)와 연결을 유지해야하며 이에 따른 리소스가 발생하는데 이를 단발성으로 바꾸고 리소스를 줄여 더 많은 연결을 추구한다.
- 서버에선 반복되는 요청에도 매번 연결, 해제의 과정을 수행해야 하므로 오버헤드가 발생할 여지가 있다.
- 오버헤드를 줄이기 위해 HTTP의 KeepAlive(연결유지)속성을 사용해 주기적으로 패킷을 보내는 방식을 채택하였다(만일 반응이 없을경우 접속을 끊는다.)
- 콘서트 티켓팅을 한다고 했을때 서버측은 실시간으로 예약, 예약취소가 이뤄지나 접속한 유저의 웹사이트에선 예약이 가능하다는 차이점이 발생한다. (공석이라고 나오지만 클릭하면 예약석이라고 나타나는점)
패킷 - 패킷교환 네트워크에 의해 전달되는 형식화된 데이터단위
2. 무상태성(stateless)
- 비연결성으로 인해 이전에 어떠한 상태를 갖고있는지 알수 없는데 로그인을 했지만 다른 페이지로 이동했을때 로그인을 했는지 안했는지 알지 못해 재로그인을 요청할수 있다 즉, 매번 새로운 인증을 진행해야하는 단점이 생긴다.(접속 -> 로그인 -> 상품클릭 -> 로그인 -> 주문 -> 로그인...)
- 서버가 클라이언트의 상태를 보존하지 않는것으로 서버의 확정성은 용이하나 클라이언트가 추가적인 데이터를 전송해야하는 단점이 있다. (상태유지 - 요청을 받은 서버가 기억하고 있는것으로 여기선 로그인을 유지하지 않는다고 이해하면 된다.)
- 로그인이 필요 없는경우 상관없으나 로그인이 필요한경우 쿠키, 세션,토큰을 이용해 상태를 유지하며 이러한 상태 유지는 최소한으로만 사용한다.
- 쿠키와 (브라우저 저장), 세션(DB 저장), 토큰의 등장으로 비연결성, 무상태성이 보완되기 시작
쿠키 - 서비스를 운영하려면 서버가 클라이언트를 기억해야하는 경우가 많은데 쿠키라는것을 저장하여 서버가 클라이언트를 식별하도록 한다 (사용자의 정보가 브라우저에 저장되기에 위변조 가능성이 높다)
세션 - 쿠키의 위변조 가능성을 방지하기 위해 나타난것으로 서버에 사용자 정보를 저장하는것
구분 | HTTP 요청 메세지 | HTTP 응답 메시지 | ||||||||
Startline | 메서드, 경로, 프로토콜의 버전 | 프로토콜의 버전, 상태 코드, 상태 텍스트 | ||||||||
헤더 | 요청한 HTTP의 헤더 | 응답에 설정한 HTTP 헤더 | ||||||||
바디 | HTTP요청이 POST인 경우에 한정해서 추가됨 | 요청에 대한 응답(201,204는 공란) |
상태 텍스트 - HTTP/1.1 404 Not found
상태 코드 (Status-code) - 404
HTTP코드의 종류
- 1xx(정보) - 요청을 받았으며 기존 프로세스를 계속 진행합니다.
- 2xx(성공) - 요청을 성공적으로 받았으며 정상확인 및 수용하였습니다.
- 3xx(리다이렉션) - 요청 완료를 위해선 추가적인 작업이 필요합니다.
- 4xx(클라이언트 오류) - 요청의 문법이 잘못되거나 요청처리가 불가합니다.
- 5xx(서버 오류) - 서버가 명백히 유효한 요청에 대해 충족을 실패했습니다
HTTP메서드 종류
- GET (멱등성 보장)
- 데이터(Read)를 읽거나 검색(Retrieve)할때 사용되는 메서드
- 성공시 XML 또는 JSON과 200코드리턴, 에러 발생시 404,400에러 발생
- HTML GET요청시 모든 필요한 데이터를 URL 주소 끝에 파라미터로 포함해서 요청하며 이 끝부분을 쿼리스트링(QueryString) 이라고 한다.
- 오직 데이터를 읽어올때만 사용하기에 idempotent이 보장된다 (계속 조회해도 리소스 변동 없음)
- POST
- 새로운 리소스를 생성(Create)할때 사용되며 주로 하위 리소스를 생성할때 사용하며 추가 리소스를 생성한다는 점에서 안전하지도, idempotent하지도 않다 -> 덮어쓰기라고 생각하면 된다.
- 성공시 주로 201코드(게시물 작성, 회원 가입 등 신규 데이터를 서버에 덮어쓰는 작업이 성공시)
- 전송해야할 데이터를 HTTP 메세지 Body에 담아 전송하며 브라우저 기록에 남지 않는다 (캐시 및 북마크 불가)
- HTML POST 요청시 추가적인 데이터를 body에 포함해서 요청할수 있다.
- DELETE (멱등성 보장)
- 서버에서 요청한 URL리소스를 삭제하도록 요청 (클라이언트는 항상 삭제한다고 생각하지만 요청을 무시할수도 있다)
- 동일한 요청을 하여도(이미 삭제된걸 요청해도) 삭제된 결과는 동일하다.
- PUT (멱등성 보장)
- 결과를 대체하기에 동일한 요청을 하여도 최종결과는 같다
- OPTIONS (preflight)
- 브라우저가 서버에게 지원하는 옵션을 요청 및 허가된 요청에 한해서 전송하기 위한 보안상의 목적 (조건부)
- 통신옵션을 확인할때 사용되며 어떤 Method, header, content type을 지원하는지 알수있다. (Content type이 표준이 아닐경우 Option을 넣는것)
멱등성 - 자동복구 매커니즘으로 "서버가 타임아웃으로 정상적인 응답을 못줬을때 클라이언트가 동일한 요청을 다시해도 되는지"에 대한 근거
타임아웃 - 일정 시간내에 완료하지 못한경우 발생하도록 설계 (1분간 접속 안될경우 에러가 나타나는것)
GET과 POST 비교
GET - URL에 값이 저장됨, 가져오기 | POST - URL에 값이 저장되지 않음, 덮어쓰기 | |||
History (기록) |
브라우저 히스토리 저장 (파라미터가 URL의 일부분) |
파라미터는 브라우저 히스토리에 저장 X | ||
Bookmarked (즐겨찾기) |
즐겨찾기 가능 (요청한 파라미터 자체가 URL로 인코딩) |
즐겨찾기 불가 요청 파라미터에 request URL이 나타나지 않음 |
||
button/re-submit behaviour (재클릭, 재 제출) |
브라우저 캐시에 HTML이 저장되어있다면 서버에 submit되지 않는다. |
브라우저가 보통 사용자에게 데이터가 다시 submit되어야 한다고 alert을 준다. |
||
Encoding type (enctype attribute) (인코딩 방식) |
ASCII characters만 허용 | 제한없음 | ||
Parameters (매개 변수) |
전송 가능하지만 URL에 넣을 수 있는 파라미터 데이터가 제한된다. 통상적으로 2K | 서버에 파일 업로드하는 것을 포함하여 파라미터를 전송할 수 있다. | ||
Security (보안성) |
상대적 약세 (데이터가 URL의 일부로 전송 및 브라우저 히스토리에 저장,서버에 플레인 텍스트로 로그 존재) |
상대적 우세 (파라미터들이 브라우저 히스토리나 서버 로그에 저장되지 않기때문) |
||
Usability (유용성) |
URL에 전부 보이기 때문에 비밀번호등 민감한 정보들을 전송에 사용이 금지 | 숨겨지기 때문에 비밀번호와 같은 민감한 정보를 전송하는데 사용된다. | ||
Visibility (가시성) |
GET 메소드는 모두에게 보여진다. (브라우저 주소창에 보여지고 전송가능한 크기도 제한된다.) | POST 메소드는 URL에 보여지지 않는다. (Body에서 보인다) |
||
Cached (캐시) |
idempotent하기 때문에 캐시 O (같은 요청을 여보내도 항상 같은 응답이 온다.) |
idempotent하지 않아 캐시 X (같은 요청을 여러 번 보내도 다른 응답이 올 수 있다.) |
전체 메서드 비교

'CS' 카테고리의 다른 글
크로스 도메인,SOP, CORS, XSS, (0) | 2024.01.25 |
---|---|
IP, DNS, HTTP (1) | 2023.07.09 |
난독화 (0) | 2023.05.03 |
개발방법론 (0) | 2023.05.02 |
인라이닝 (0) | 2023.04.20 |