[네트워크] HTTP에 대하여(특징 - StatusCode, Header, Method 등)

HTTP(Hpyertext Transfer Protocol)는 인터넷에서 데이터를 전송하기 위한 프로토콜이다. 클라이언트와 서버 간의 상호작용을 위해서 설계되었고 인터넷상에서 여러가지 타입의 리소스들을 주고받을 수 있다.


특징

Stateless(무상태성)
HTTP의 각 요청은 독립적으로 처리한다. 이전 요청과 관계가 없으므로 확장성(스케일 아웃)이 좋다. 하지만 서버에서 상태를 보존하지 않으므로 클라이언트 측에서 추가적으로 데이터를 전송해야하는 문제가 있다.(경우에 따라 서버에서 상태를 저장하는 경우도 있음. - 로그인 정보)

Connectionless(비연결성)
HTTP는 요청/응답 이후 연결을 끊는 비연결성 프로토콜이다. 이러한 특징으로 서버의 부하를 줄이는 장점이 있다. HTTP 1.1부터는 1번의 연결로 N번 요청이 가능하다.(Persistent Connection) 한 번에 필요한 요청을 모두 보내기 위해 효율적인 방법을 택했다.

Request Method
서버에 요청시 GET, POST, PUT, DELETE 등 다영한 요청 메서드를 이용할 수 있다. 이를 통해 어떠한 행위를 하고자하는지 명시적으로 표현할 수 있다.

Header
HTTP의 요청과 응답은 헤더와 본문으로 나뉘며, 헤더에는 요청이나 응답에 대한 메타데이터를 포함한다. 데이터에 대한 정보나 효율적인 통신을 위한 정보를 담을 수 있다.

Status Code(상태코드)
응답에 대한 상태코드를 제공해줌으로써 성공인지 실패라면 어떤 오류인지 쉽게 알 수 있다.


StatusCode(상태코드)

HTTP의 큰 특징 중 하나인 상태코드는 요청에 대한 응답으로 요청처리 상태를 숫자로 반환해준다.

1xx
조건부 응답으로써 요청을 받았으며 이후 작업을 계속하라는 것을 의미한다. 대표적인 상태코드는 다음과 같다.

100(계속) - 요청자는 계속 요청을해야한다. 서버는 부분을 받았고 나머지를 기다리고 있음을 나타낸다.
101(프로토콜 전환) - 요청자가 서버에 프로토콜 전환을 요청 및 서버에서 승인중(ex. 웹소켓 연결 요청 HTTP -> ws)

2xx(성공)
요청을 성공적으로 처리했음을 의미한다.

200(성공) - 요청한 정보를 성공적으로 처리
201(작성) - 서버에 새로운 리소스 생성완료
204(컨텐츠 없음) - 응답값으로 제공해줄 데이터가 없음

3xx(리다이렉션)
요청측에서는 요청을 마치기 위해 추가적인 동작을 취해야한다는 것을 의미한다.

301(영구 이동) - 새로운 위치로 영구 이동하였음을 의미
302(임시 이동) - 임시로 다른 위치로 이동하였음을 의미
304(Not Modified) - 값이 여전히 유효하다는 것을 의미(ex. Etag)

4xx(요청오류)
요청측에서 잘못된 요청을 보냈다는 것을 의미한다.

400(잘못된 요청) - API에 정의되지 않은 방식으로 요청 등 잘못된 요청
401(Unauthorized) - 인증되지 않음
402(결제 필요) - 결제가 필요한 요청
403(Forbidden) - 권한없음. 인증은 되었지만 해당 리소스로의 접근권한은 없음
404(Not Found) - 요청한 리소스를 찾을 수 없음

5xx(서버오류)
응답측에서 요청을 처리하지 못했다는 것을 의미한다.

500(서버 오류) - 서버에 오류가 발생
502(Bad Gateway) - 프록시 서버가 서버에서 잘못된 응답을 받음
503(Service Unavailable) - 서버의 과부하, 점검등의 이유로 일시적으로 서버에 접근불가


요청/응답에 대한 메타데이터로 데이터를 캐싱할 것인지, 인코딩한 방법 등을 명시할 수 있어 유연하고 확장가능한 요청/응답을 보낼 수 있다.

General Header

요청 및 응답 모두에서 사용하는 일반적인 목적의 헤더들이다.

Date - HTTP 메시지를 생성한 일시
Connection - TCP 연결상태 알림 close, Keep-Alive
Cache-Control - 아래 Cache 파트에서 설명

Entity Header

메시지 body의 컨텐츠를 나타내는 헤더이다.

Content-Type - 데이터의 미디어 타입 정보 test/html; charset-latin-1
Content-Encoding - 데이터의 압축 방식 gzip, deflate
이밖에도 Language, Length, Location 등이 있다.

Request Header

HTTP 요청시에 들어가는 헤더들이다.

Host - 요청하는 호스트에대한 호스트명, 포트번호
User-Agent - 클라이어트 소프트웨어 명칭 및 버전 정보
Cookie - Set-Cookie로 클라이언트에 설정된 쿠키정보
Referer - 이전 웹 링크 주소
Authorization - 인증토큰을 서버로 보낼때 사용하는 헤더
Origin - POST 요청시, 요청이 시작되는 주소
Accept - 클라이언트가 원하는 미디어타입 및 우선순위를 알림(Content-xxx와 일대일 대응)
Accept-Charset - 원하는 문자집합
Accept-Encoding - 원하는 인코딩 방식
Accept-Language - 원하는 가능한 언어

Response Header

HTTP 응답시에 들어가는 헤더들이다.

Accept-Range - 부분요청이 가능한지 bytes, none
Set-Cookie - 서버측에서 클라이언트에게 세션 쿠키정보를 설정
Allow - 서버측에서 지원가능한 HTTP 메서드 리스트를 나타냄
Access-Control-Allow-Origin - 요청가능한 Origing 주소
Location - 리다이렉트된 때 이동할 리소스 주소를 명시 /post/1

Cache

위 내용 중 캐시와 관련된 헤더들을 따로 정리하였다.

ExpiresCache-Control을 이용한 캐싱 유효 확인
캐시 유효시간을 이용한 캐싱방법이다. 유효기간이 지나면 컨텐츠를 재요청한다.

  • Expires(응답 헤더)
    • 컨텐츠가 언제 만료되는지를 일시를 알려줌
    • Cache-Control에 max-age가 있는 경우 이 헤더는 무시된다.
  • Cache-Control(응답 헤더)
    • 이름 그대로 캐시 정책과 유효기간이 명시된다.
    • no-cache, public, max-age 등의 값이 포함된다.
  • Age(응답 헤더)
    • max-age 시간 내에서 얼마나 흘렀는지 초 단위로 알려준다.


Last-Modified를 이용한 캐시 컨텐츠 변경확인
마지막으로 수정된 시간을 이용해 컨텐츠 수정여부를 검사하는 방법이다. CDN과 같은 캐시 서버를 사용하는 경우 리소스의 수정시간이 정확하지 않는 경우가 있을 수 있다. 즉, 캐시 효과가 떨어질 수 있다.

  • Last-Modified(응답헤더)
    • 컨텐츠가 마지막으로 수정된 시간이 담겨있다.
  • If-Modified-Since(요청헤더)
    • Last-Modified 값을 요청시 이 헤더에 넣어서 보낸다.
    • 서버에서 이 헤더와 리소스의 수정시간을 비교한다.
    • 컨텐츠가 변하지 않았따면 304, 변했다면 200과 함께 새로운 Last-Modified을 응답한다.


Etag를 이용한 캐시 컨텐츠 변경확인
컨텐츠의 버전 정보를 나타내는 태그를 이용해 변경 여부를 확인한다. 캐시 유효성을 확인하는 요청을 최소화하고 네트워크 대역폭을 절약할 수 있다.

  • Etag(응답헤더)
    • 컨텐츠의 식별자로써 이 값이 변하면 컨텐츠의 내용이 변했다는 것을 뜻함
    • 클라이언트의 메모리나 디스크에 컨텐츠를 캐시중일때 이 Etag로 컨텐츠의 변화를 확인한다.
  • If-None-Match(요청헤더)
    • Etag가 변했는지를 확인하기 위해 사용한다.
    • 이 키에 기존 Etag를 넣어 보낸다.
    • 컨텐츠가 변하지 않았다면 304, 변했다면 200과 함께 Etag를 응답받는다.


Method

요청에 대한 행위를 명시할 수 있는 방법이다. 서버의 자원을 어떻게 할 것인가?를 HTTP Method를 이용하여 서버에 알려준다. 행위에 대해 요청만으로 확인할 수 있어 가독성이 좋아진다.

GET
서버로 리소스를 요청하는 메서드. 요청된 리소스는 응답 본문에 포함되어 전송된다.

POST
서버에 데이터를 업로드하는 메서드. 데이터를 요청 본문에 포함하여 전송한다.

PUT
기존데이터 전체를 새로운 데이터로 업데이트하는 메서드. 데이터를 요청 본문에 포함하여 전송한다.

PATCH
기존데이터 중 일부를 새로운 데이터로 업데이트하는 메서드. 데이터를 요청 본문에 포함하여 전송한다.

DELETE
데이터를 삭제하는 메서드.

OPTIONS
서버가 지원하는 HTTP 메서드를 확인하는데 사용.

HEAD
리소스가 변경되었는지 확인하는데 사용.

CONNECT
TCP/IP 터널을 설정하는데 사용.

💡 GET vs POST
GET은 데이터를 요청할때, POST는 데이터를 생성할때 사용.
GET은 요청데이터를 URL의 쿼리스트링에, POST는 요청본문에 넣는다.
GET은 캐시가 가능하지만 POST는 불가능하다.(멱등성)
GET은 요청시 데이터 길이 제한이 있지만 POST는 없다.

카테고리:

업데이트:

댓글남기기