Study/Http

HTTP

kdhoooon 2021. 7. 26. 17:45

HTTP(HyperText Transfer Protocol)

  • HTML, TEXT, IMGAE, 음성, 영상, 파일, JSON, XML(API) 거의 모든 형태의 데이터 전송 가능
  • 서버간에 데이터를 주고 받을 때도 대부분 HTTP사용
  • HTTP/1.1 버전을 가장 중요하며, HTTP/2, HTTP/3 은 1.1버전의 성능을 개선한 버전이다.
  • 클라이언트 서버 구조
  • 무상태 프로토콜(Stateless), 비연결성
  • HTTP 메시지
  • 단순함, 확장이 가능하다.

 

 

클라이언트 서버구조

  • Request Response 구조
  • 클라이언트는 서버에 요청을 보내고, 응답을 대기
  • 서버가 요청에 대한 결과를 만들어서 응답

무상태 프로토콜(Stateless)

  • 서버가 클라이언트의 상태를 보존 X
  • 장점 : 서버 확장성 높음(스케일 아웃)
  • 단점 : 클라이언트가 추가 데이터 전송
  • 실무에서의 한계
    • 모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있다.
    • 무상태 가능한 예 - 로그인이 필요 없는 단순한 서비스 소개 화면
    • 상태 유지로 해야하는 예 - 로그인
    • 로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지
    • 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태 유지
    • 상태 유지는 최소한만으로 사용

 

 

비연결성

  • 일반적으로 초 단위의 이하의 빠른 속도로 응답
  • 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 용청은 수십개 이하로 매우 작음
  • 서버 자원을 매우 효율적으로 사용할 수 있음
  • 한계와 극복
    • TCP/IP 연결을 새로 맺어야함 - 3 way handshake 시간 추가
    • 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등 수 많은 자원이 함께 다운로드
    • 위의 문제를 해결하기위해 지속연결(Persistent Connections)를 사용
    • HTTP/2, HTTP/2 에서 더 많은 최적화가 이루어 졌다.

 

 

HTTP 메시지

 

시작라인(요청 메시지)

  • 종류 : GET, POST, PUT, DELETE...
  • 서버가 수행해야 할 동작 지정

시작라인(응답 메시지)

  • HTTP 상태 코드 : 요청 성공, 실패를 나타냄
    • 200 : 성공
    • 400 : 클라이언트 요청 오류
    • 500 : 서버 내부 오류
  • 이유 문구 : 사람이 이해할 수 있는 짧은 상태 코드 설명 글

헤더

  • HTTP 전송에 필요한 모든 부가정보
  • 예 ) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보...
  • 표준 헤더가 너무 많음
  • 필요시 임의의 헤더 추가 가능

메시지 바디

  • 실제 전송할 데이터
  • HTML 문서, 이미지, 영상, JSON 등등 Byte로 표현할 수 있는 모든 데이터 전송 가능

 

 

HTTP 메서드

속성

  • 안전(Safe Mehtods)
  • 멱등(Idempotent Methods)
  • 캐시가능(Cacheable Methods)

 

안전

  • 호출해도 리소스를 변경하지 않는다.

 

멱등

  • f(f(x)) = f(x)
  • 한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 항상 똑같다.
  • 멱등 메서드
    • GET : 한 번 조회하든, 두 번 조회하든 같은 결과가 조회된다.
    • PUT : 결과를 대체한다. 따라서 같은 요청을 여러번 해도 최종 결과는 같다.
    • DELETE : 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 똑같다.
    • POST : 멱등이 아니다! 두 번 호출하면 같은 결제가 중복해서 발생한다.
  • 활용
    • 자동 복구 메커니즘

 

캐시가능

  • GET, HEAD, POST, PATCH 캐시 가능
  • 실제로는 GET, HEAD 정도만 캐시로 사용 ( POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않음)

 

종류( 빨강 : 주요메서드 )

  • GET : 리소스 조회
  • POST : 요청 데이터 처리, 주로 등록에 사용
  • PUT : 리소스를 대체, 해당 리소스가 없으면 생성
  • PATCH : 리소스 부분 변경
  • DELETE : 리소스 삭제
  • HEAD : GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
  • OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
  • CONNECT : 대상 자원으로 식별되는 서버에 댛나 터널을 설정
  • TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

 

GET

  • 리소스 조회
  • 서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)를 통해서 전달
  • 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음

 

POST

  • 요청 데이터 처리
  • 메시지 바디를 통해 서버로 요청 데이터 전달
  • 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행한다.
  • 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용

 

 

PUT

  • 리소스를 대체
    • 리소스가 있으면 대체
    • 리소스가 없으면 생성
    • 리소스를 덮어쓰기함
  • *클라이언트가 리소스를 식별한다. 
    • 클라이언트가 리소스 위치를 알고 URI 지정(POST와 차이점)

 

 

PATCH

  • 리소스 부분 변경(PUT의 단점을 보완하기 위해 고안된 기능)

 

 

DELETE

  • 리소스 제거

 

 

 

HTTP 상태 코드

  • 클라이언트각 보낸 요청의 처리 상태를 응답에서 알려주는 기능

종류

  • 1xx (Informational) : 요청이 수신되어 처리중 - 거의 사용하지 않음
  • 2xx (Successful) : 요청 정상 처리
  • 3xx (Redirection) : 요청을 완료하려면 추가 행동이 필요
  • 4xx (Client Error) : 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음
  • 5xx (Server Error) : 서버 오류, 서버가 정상 요청을 처리하지 못함

 

2xx - 성공

  • 클라이언트의 요청을 성공적으로 처리
  • 200 OK 요청 성공
  • 201 Created - 요청 성공해서 새로운 리소스가 생성됨
  • 202 Accepted - 요청이 접수되었으나 처리가 완료되지 않았음 - 배치 처리 같은 곳에 사용
  • 204 No Content - 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음 

 

3xx - 리다이렉트

  • 요청을 완료하기 위해 유저 에이전트의 추가 조치 필요
  • 300 Multiple Choices
  • 301 Moved Permanetly
  • 302 Found
  • 303 See Other
  • 304 Not Modified
  • 307 Temporary Redirect
  • 308 Permanent Redirect

리다이렉션

  • 영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동
  • 일시 리다이렉션 - 일시적인 변경, PRG(Post/Redirect/Get) ( 예: 주문 완료 후 주문 내역 화면으로 이동)
  • 특수 리다이렉션 - 결과 대신 캐시를 사용

 

영구 리다이렉션( status - 301, 308 )

  • 리소스의 URI가 영구적으로 이동
  • 원래의 URL을 사용 하지 않고, 검색 엔진 등에서도 변경 인지
  • 301 Moved Permanently - 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음
    301 예시 그림
  • 308 Oermanent Redirect - 301과 같은 기능, 리다이렉트시 요청 메서드와 본문 유지(처음 POST를 보내면 리다이렉트도 POST 유지)
    308 예시그림

일시적인 리다이렉션 ( status - 302, 303, 307 )

  • 리소스의 URI가 일시적으로 변경
  • 검색 엔진 등에서 URL을 변경하면 안됨
  • 302 Found - 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음(거의 제거 된 다고 보면 됨)
  • 307 Temporary Redirect - 302와 기능은 같음, 리다이렉트시 요청 메서드와 본문 유지( 요청 메서드를 변경하면 안된다.)
  • 303 See Other - 302와 기능은 같음, 리다이렉트시 요청 메서드가 GET으로 변경
  • PRG : Post/Redirect/Get
    • POST의 결과 화면을 GET 메서드로 리다이렉트를 보내서 오류를 막는 것
      PRG 예시

 

4xx - 클라이언트 오류

  • 클라이언트의 요청에 잘못된 문법등으로 서버가 요청을 수행 할 수 없음
  • 오류의 원인이 클라이언트에 있음
  • 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 떄문에, 똑같은 재시도가 실패함
  • 400 Bad Request -클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음
    • 요청 구문, 메시지 등등 오류
    • 클라이언트는 요청 내용을 다시 검토하고 보내야함
    • 예 ) 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때
  • 401 Unauthorized - 클라이언트가 해당 리소스에 대한 인증이 필요함
    • 인증(Authentication) 되지 않음
    • 401 오류 발생시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명
  • 403 Forbidden - 서버가 요청을 이해했지만 승인을 거부함
    • 주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우
    • 예 ) 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우
  • 404 Not Found - 요청 리소스를 찾을 수 없음
    • 요청 리소스가 서버에 없음
    • 클라이언트가 권한이 부족한 리소스에 접근할 때(403오류와 같은 상황) 해당 리소스를 숨기고 싶을 때

5xx - 서버 오류

  • 서버 문제로 오류 발생
  • 서버에 문제가 있기 떄문에 재시도 하면 성공할 수도 있음( 예 - 복구가 됨)
  • 500 Internal Server Error - 서버 문제로 오류 발생, 애매하면 500 오류
    • 서버 내부 문제로 오류 발생
  • 503 Service Unabailable - 서비스 이용 불가
    • 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음
    • Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수도 있음

'Study > Http' 카테고리의 다른 글

URI(Uniform Resource Identifier)  (0) 2021.07.26
인터넷 통신  (0) 2021.07.26