HTTP 란 무엇인가?
HTTP 란 무엇인가?
HTTP (HyperText Transfer Protocol)
서버 - 클라이언트간 데이터를 주고 받기 위해 사용되는 통신 규약 입니다.
네트워크 계층 구조상에서는 TCP 위에서 동작하는 애플리케이션 계층(Application Layer) 프로토콜로, 실제 데이터 전송과 신뢰성 보장은 TCP가 담당하고 HTTP는 데이터의 형식과 교환 규칙을 정의합니다.
본문은 일반적인 텍스트 이외에도 바이너리 데이터도 전송이 가능하여 파일 업로드, 이미지, 동영상, 압축 파일 등 다양한 형태의 데이터를 전달할 수 있습니다.
HTTP는 요청(Request)과 응답(Response) 구조로 동작하며, 클라이언트가 요청을 보내면 서버는 이에 대한 응답을 반환하는 방식입니다.
각 요청은 독립적으로 처리되며, 이전 요청의 상태를 유지하지 않는 무상태(stateless) 특성을 가지기 때문에 쿠키(세션)나 인증 헤더(토큰)를 통해 사용자 상태나 인증 정보를 전달합니다.
요청과 응답의 기본 구조
HTTP 요청은 요청 라인(Request Line)을 통해 메서드와 요청 대상을 먼저 전달한 뒤, 요청 헤더와 본문이 이어지는 구조를 가집니다.
예를 들어, 브라우저가 서버에 페이지를 요청할 때의 요청 라인은 다음과 같습니다.
GET /articles/1 HTTP/1.1
이에 대한 서버의 응답은 상태 라인(Status Line)으로 시작하며, 요청 처리 결과를 상태 코드로 먼저 전달합니다.
HTTP/1.1 200 OK
브라우저 통신에서 주로 사용되는 요청 헤더
| 헤더 이름 | 설명 |
|---|---|
| Host | 요청을 보내는 대상 도메인을 나타내며, 하나의 서버에서 여러 도메인을 처리하기 위해 사용된다. |
| User-Agent | 요청을 보낸 브라우저와 운영체제, 엔진 정보를 포함하며, 서버는 이를 기반으로 브라우저별 분기 처리나 통계를 수행할 수 있다. |
| Accept | 클라이언트가 응답으로 받을 수 있는 데이터 타입을 나타내며, 서버는 이를 참고해 적절한 형식으로 응답한다. |
| Accept-Encoding | 클라이언트가 해제할 수 있는 압축 방식(gzip, br 등)을 나타내며, 응답 데이터의 압축에 사용된다. |
| Accept-Language | 클라이언트가 선호하는 언어 정보를 전달하며, 다국어 서비스에서 응답 언어를 결정하는 데 사용된다. |
| Connection | TCP 연결을 유지할지 여부를 나타내며, keep-alive 설정 시 동일한 연결을 재사용한다. |
| Referer | 현재 요청이 발생한 이전 페이지의 주소를 나타내며, 유입 경로 분석이나 보안 검증에 활용된다. |
| Cookie | 브라우저에 저장된 쿠키 정보를 서버로 전달하며, 로그인 상태나 사용자 세션을 유지하는 데 사용된다. |
| Authorization | 인증 정보를 포함하며, 토큰 기반 인증(Bearer Token 등)에 주로 사용된다. |
| Content-Type | 요청 본문의 데이터 형식을 나타내며, JSON, form-data 등 서버가 본문을 해석하는 기준이 된다. |
| Content-Length | 요청 본문의 크기를 바이트 단위로 나타내며, 서버가 요청 데이터를 정확히 읽기 위해 사용된다. |
브라우저 통신에서 주로 사용되는 응답 헤더
| 헤더 이름 | 설명 |
|---|---|
| Content-Type | 응답 본문의 데이터 형식을 나타내며, 브라우저가 데이터를 어떻게 해석할지 결정한다. |
| Content-Length | 응답 본문의 크기를 바이트 단위로 나타낸다. |
| Content-Encoding | 응답 데이터에 적용된 압축 방식(gzip, br 등)을 나타낸다. |
| Cache-Control | 응답의 캐시 정책을 지정하며, 브라우저와 중간 캐시 서버의 동작에 영향을 준다. |
| Expires | 응답이 만료되는 시점을 나타내며, 캐시 유효 기간 판단에 사용된다. |
| ETag | 응답 리소스의 고유 식별자로, 캐시 검증에 사용된다. |
| Last-Modified | 리소스가 마지막으로 수정된 시간을 나타내며, 캐시 검증에 활용된다. |
| Set-Cookie | 브라우저에 저장할 쿠키 정보를 전달한다. |
| Location | 리다이렉트 시 이동할 URL을 나타낸다. |
| Server | 서버 소프트웨어 정보를 나타낸다. |
| Date | 응답이 생성된 서버 시간을 나타낸다. |
| Access-Control-Allow-Origin | CORS 설정을 통해 허용된 요청 출처를 지정한다. |
자주 사용하는 HTTP 메서드
| 메서드 | 주요 용도 | 요청 본문 | 설명 |
|---|---|---|---|
| GET | 리소스 조회 | 없음 | 서버의 상태를 변경하지 않고 데이터를 조회할 때 사용된다. |
| POST | 리소스 생성 / 처리 요청 | 있음 | 새로운 리소스를 생성하거나 서버에서 처리를 수행하도록 요청한다. |
| PUT | 리소스 전체 수정 | 있음 | 기존 리소스를 전체 교체하며, 여러 번 요청해도 결과가 동일하도록 설계된다. |
| PATCH | 리소스 일부 수정 | 있음 | 리소스의 특정 필드만 부분적으로 수정할 때 사용된다. |
| DELETE | 리소스 삭제 | 없음 | 지정한 리소스를 삭제하는 데 사용된다. |
멱등성
동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남을 때, 해당 HTTP 메서드가 멱등성을 가졌다고 말합니다.
자주 사용하는 HTTP 상태 코드
| 상태 코드 | 분류 | 의미 | 설명 |
|---|---|---|---|
| 200 | 2xx 성공 | OK | 요청이 정상적으로 처리되었음을 의미한다. |
| 201 | 2xx 성공 | Created | 요청이 성공적으로 처리되어 새로운 리소스가 생성되었음을 의미한다. |
| 204 | 2xx 성공 | No Content | 요청은 성공했지만 응답 본문이 없음을 의미한다. |
| 301 | 3xx 리다이렉션 | Moved Permanently | 요청한 리소스가 영구적으로 다른 위치로 이동했음을 의미한다. |
| 302 | 3xx 리다이렉션 | Found | 요청한 리소스가 일시적으로 다른 위치에 있음을 의미한다. |
| 304 | 3xx 리다이렉션 | Not Modified | 캐시된 리소스를 그대로 사용해도 됨을 의미한다. |
| 400 | 4xx 클라이언트 오류 | Bad Request | 요청 형식이 잘못되었거나 유효하지 않음을 의미한다. |
| 401 | 4xx 클라이언트 오류 | Unauthorized | 인증이 필요하거나 인증 정보가 유효하지 않음을 의미한다. |
| 403 | 4xx 클라이언트 오류 | Forbidden | 인증은 되었으나 접근 권한이 없음을 의미한다. |
| 404 | 4xx 클라이언트 오류 | Not Found | 요청한 리소스를 찾을 수 없음을 의미한다. |
| 409 | 4xx 클라이언트 오류 | Conflict | 요청이 서버의 현재 상태와 충돌함을 의미한다. |
| 500 | 5xx 서버 오류 | Internal Server Error | 서버 내부 오류로 요청을 처리할 수 없음을 의미한다. |
| 502 | 5xx 서버 오류 | Bad Gateway | 게이트웨이 또는 프록시 서버에서 잘못된 응답을 받았음을 의미한다. |
| 503 | 5xx 서버 오류 | Service Unavailable | 서버가 일시적으로 요청을 처리할 수 없는 상태임을 의미한다. |