HTTP 란?

  • 웹에서 HTML 등을 주고 받기 위한 프로토콜
  • TCP 기반이며 80번 포트 사용
  • ISO 7계층, TCP/IP 계층의 응용계층
  • Stateless(무상태) 프로토콜 : 각 각의 request가 서로 연관 없고 독립적임
  • 클라이언트-서버 모델 : 클라이언트는 요청을 하고 서버는 응답을 한다

ㅁ URL 전체문법

scheme://[user@]host[:port]/path?query#fragment

  • scheme : 주로 프로토콜 입력
  • user : 사용자 정보를 포함할 때 사용, 거의 사용하지 않음
  • host : 호스트명, 도메인, IP주소 입력
  • port : 포트번호, 프로토콜을 사용하기 때문에 생략가능
  • path : 리소스의 경로
  • query : 쿼리 파라미터
  • fragment : 내부 북마크로 사용, 서버로 전송되지 않음

1. HTTP Request 메시지

GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com

(1) start line

  • 메서드
    1. GET : 존재하는 자원을 요청(Read)
      • query를 통해 데이터 전달
    2. POST : 새로운 자원을 생성(Create)
      • 메시지 바디를 통해 데이터 전달
    3. PUT : 존재하는 자원을 변경(Update)
      • 자원이 이미 존재하면 대체(덮어씌움), 존재하지 않으면 생성
    4. PATCH : 존재하는 자원을 부분변경(Update)
      • PUT보다 나중에 생김
    5. DELETE : 존재하는 자원을 삭제(Delete)
    6. HEAD : GET과 동일하지만 바디 부분을 제외하고 상태줄과 헤더만 반환
    7. OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)를 설명, 주로 CORS에서 사용
  • path
    • URI를 사용
    • ex) /notice/10?a=b&x=y
  • HTTP 버전
    • 통상적으로 HTTP/1.1 버전이 대중화 되어있다.
    • HTTP/2, HTTP/3은 성능개선

(2) headers

  • field-name은 대소문자 구분 X ex) Host = HOST
  • value는 대소문자 구분 O
  • field-name과 클론 사이에 띄어쓰기가 없어야 한다 ex) Host: ~~~~
  • Host : 호스트명
  1. 협상
    • accept : 클라이언트가 선호하는 미디어타입
    • accept-language : 클라이언트가 선호하는 자연 언어, 우선순위 설정가능 (q파라미터 생략시 1)
      accept-language: ko-KR,en;q=0.8
    • accept-charset : 클라이언트가 선호하는 문자인코딩
    • accept-encoding : 클라이언트가 선호하는 압축인코딩
  2. 정보
    • referer : 이전 웹페이지 주소
    • user-agent : 클라이언트 애플리케이션 정보(브라우저 등)
    • host : 필수, 요청할 호스트 정보(도메인)
  3. 쿠키
    • cookie : 쿠키데이터
  4. 캐시
    • if-modified-since : 브라우저가 갖고있는 캐시의 최종 수정날짜

(3) body

  • 실제 전송되는 데이터
  • request 메시지는 body가 없는 경우가 많다.

2. HTTP Response 메시지

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 1523

<html>
    <body>...</body>
</html>

(1) start line

  • HTTP버전, HTTP 상태코드/메시지

(2) headers

  • HTTP 전송에 필요한 부가정보가 담긴다
  • 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청클라이언트 정보, 서버 애플리케이션 정보, 캐시관리 정보 등
  1. 표현
    • content-type : 표현 데이터의 형식 (text/html, application/json, image/png 등),
    • content-length : 표현 데이터 길이, byte
    • content-encoding : 압축시 타입 (gzip, deflate, identity)
    • content-language : 자연언어 표시 (ko, en, en-US)
  2. 정보
    • server : 응답하는 웹서버
    • date : 발생시간
  3. 쿠키
    • set-cookie : 쿠키데이터 설정
  4. 캐시
    • cache-control : 캐시옵션 설정 (max-age, no-cache, no-store)
    • last-modified : 최종 수정날짜

(3) body

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

HTTP 상태코드

  1. 100번대 - 정보 응답
    • 잘 사용되지 않음
  2. 200번대 - 성공 응답
    • 200 OK
    • 201 Created : 요청 성공으로 새로운 리소스 생성, Location 헤더를 갖음
    • 202 Accepted : 요청이 접수되었으나 처리가 아직 완료되지 않음
    • 204 No Content : 요청을 성공적으로 수행했지만 응답 본문에 보낼 데이터가 없음 ex) save 버튼클릭
  3. 300번대 - 요청완료를 위해 추가작업 필요, Location 헤더가 있으면 그 위치로 리다이렉트
    1. 영구 리다이렉션 : 요청 URI가 영구적으로 이동
      • 301 Moved Permanently : 리다이렉트시 GET
      • 308 Permanent Redirect : 리다이렉트시 요청메서드 유지
    2. 일시 리다이렉션 : 요청 URI가 일시적으로 이동
      • 302 Found : 리다이렉트시 GET
      • 303 See Other : 리다이렉트시 GET(무조건 변경됨)
      • 307 temporary Redirect : 리다이렉트시 요청메서드 유지
    3. 캐시 리다이렉션
      • 304 Not Modified : 클라이언트에게 리소스가 수정되지 않았음을 알림 -> 저장된 캐시를 재사용한다, Body부분이 없음
  4. 400번대 - 클라이언트 에러
    • 400 Bad Request : 잘못된 요청으로 서버가 처리할 수 없음
    • 401 Unauthorized : 인증이 필요함
    • 403 Forbidden : 서버가 승인거부
    • 404 Not Found : 요청 리소스가 서버에 없음
  5. 500번대 - 서버 에러
    • 500 Internal Server Error
    • 503 Service Unavailable : 서비스 이용 불가 (일시적 과부하 or 예정된 작업)

POST와 PUT의 차이

(1) 공통점

  • 자원을 생성하는 역할 (PUT의 경우 기존에 존재하지 않을 시 생성함)

(2) 차이점

  • POST
    • 클라이언트가 등록될 리소스의 URI를 몰라도 된다. (서버가 새로 등록된 리소스 URI를 생성)
    • 멱등성이 없음 : 요청이 2번 들어오면 자원이 2번 생성된다
# request
POST /members

# response
HTTP/1.1 201 Created
Location: /members/100
  • PUT
    • 클라이언트가 직접 리소스의 URI를 지정해야 한다.
    • 멱등성이 있음 : 여러번 요청이 들어와도 1번으로 인식된다
# request
PUT /files/star.jpg

HTML 폼 사용

  • GET, POST 메서드만 존재
  • 컨트롤 URI(동사로 된 리소스 경로)를 사용해야 한다.