HTTP02


HTTP 상태코드


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

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

    2xx success


클라이언트의 요청을 성공적으로 처리

  • 200 ok
  • 201 Created
  • 202 Acceted
  • 204 No Content

200 ok

201 Created

202 Acceted

요청이 접수되었으나 처리가 완료되지 않았다.

  • 배치 처리 같은 곳에서 사용
  • 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리함

204 NO Content

서버가 요청을 성공적으로 수행했지만, 응답 payload 본문에 보낼 데이턱 없다.

  • 문서 편집기에서 save 버튼
  • save 버튼의 결과로 아무 내용이 없어도 된다.
  • save 버튼을 눌러도 같은 화면을 유지해야 한다.
  • 결과 내용이 없어도 204 메시지만으로 성공을 인식할 수 있다.

3xx 리다이렉트


요청을 완료하기 위해 유저 에이전트의 추가 조치 필요 300 Multiple Choices

  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 304 Not Modified
  • 307 Temporary Redirect
  • 308 Permanent Redirect

4xx - client error


  • 클라이언트의 요청에 잘못된 문법등으로 서버가 요청을 수행할 수 없음
  • 오류의 원인이 클라이언트에 있음
  • 중요! 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 똑같은 재시도가 실패한다.

400 bad request

클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없다.

  • 요청 구문, 메시지 등등 오류
  • 클라이언트는 요청 내용을 다시 검토하고, 보내야함
  • 예) 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때

401 Unahthorized

클라이언트가 해당 리소스에 대한 인증이 필요하다.

  • 인증(Authentication) 되지 않음(로그인 x)
  • 401 오류 발생시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명

403 Forbidden

서버가 요청을 이해했지만 승인을 거부한다.

  • 주로 인증 자격 증명은 있지만, 접근 권한이 불충분할 때 일어난다.

404 Not Found

요청 리소스를 찾을 수 없다.

  • 요청 리소스가 서버에 없다.
  • 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때

5xx Server Error


  • 서버 문제로 오류 발생
  • 서버에 문제가 있기 때문에 재시도 하면 성공할 수도 있다.

500 Internal Server Error

  • 서버 내부 문제로 오류 발생
  • 애매하면 500 오류

503 Service Unavailable

  • 서비스 이용 불가
  • 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음
  • Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수도 있음

HTTP 일반헤더


표현

  • Content-Type: 표현 데이터의 형식
  • Content-Encoding: 표현 데이터의 압축 방식
  • Content-Language: 표현 데이터의 자연 언어
  • Content-Length: 표현 데이터의 길이
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Encoding: gzip
Content-Language: ko
Content-Length: 3423

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

Content-Type

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

<html>
 <body>...</body>
</html>
  • 표현 데이터의 형식 설명
  • 미디어 타입, 문자 인코딩
  • text/html; charset=utf-8
  • application/json
  • image/png

Content-Encoding

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

lkj123kljoiasudlkjaweioluywlnfdo912u34lj
ko98udjkl
  • 표현 데이터를 압축하기 위해 사용
  • 데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가
  • 데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축 해제

Content-Language

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

<html>
    안녕하세요.
</html>
  • 표현 데이터의 자연 언어를 표현

Content-Length

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

hello
  • 바이트 단위
  • 패킷를 여러개 보내는 Transfer-Encoding(전송 코딩)시 사용해선 안됨

협상

  • 클라이언트가 선호하는 표현 요청
  • Accept: 클라이언트가 선호하는 미디어 타입 전달
  • Accept-Charset: 클라이언트가 선호하는 문자 인코딩
  • Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
  • Accept-Language: 클라이언트가 선호하는 자연 언어

  • 협상 헤더는 요청헤더에만 사용한다.
GET /event
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
  • 0~1, 클수록 높은 우선순위
  • 생략 시 1

전송방식

  • 단순 전송
  • 압축 전송
  • 분할 전송
  • 범위 전송

    단순 전송

    일반적인 http 전송

    압축 전송

    Content-Encoding 헤더를 이용한 압축 전송

    분할 전송

    Transfer-Encoding 청크 단위로 메시지가 분할하여 전송한다. ```http HTTP/1.1 200 OK Content-Type: text/plain Transfer-Encoding: chunked

5 Hello 5 World 0 \r\n


### 범위 전송
Content-Range
```http
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Range: bytes 1001-2000 / 2000

qweqwe1l2iu3019u2oehj1987askjh3q98y

일반 정보

  • From: 유저 에이전트의 이메일 정보
  • Referer: 이전 웹 페이지 주소
  • User-Agent: 유저 에이전트 애플리케이션 정보
  • Server: 요청을 처리하는 오리진 서버의 소프트웨어 정보
  • Date: 메시지가 생성된 날짜

Referer

  • 현재 요청된 페이지의 이전 웹 페이지 전송
  • Referer를 사용해서 유입 경로 분석 가능
  • 요청에서 사용가능

User-Agent

user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
  • 웹 브라우저, 사용환경 정보 등
  • 통계 정보
  • 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능

Server

  • 요청을 처리하는 origin 서버의 소포트웨어 정보
  • origin 서버
    • 요청한 데이터가 있는 목적지 서버
  • 응답에서 사용

Date

Date: Tue, 15 Nov 1994 08:12:31 GMT
  • 메시지가 발생한 날짜와 시간

HTTP 특별한헤더


  • Host: 요청한 호스트 정보(도메인)
  • Location: 페이지 리다이렉션
  • Allow: 허용 가능한 HTTP 메서드
  • Retry-After: 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간

HOST

GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
  • 요청한 호스트 정보(도메인)
  • 요청에서 사용
  • 필수
  • 하나의 서버가 여러 도메인을 처리해야 할 때
  • 하나의 IP 주소에 여러 도메인이 적용되어 있을 때

가상 호스트를 통해 한 ip에서 여러 도메인 서버를 처리할 수 있다. 이 때 요청한 도메인 서버를 찾아가는 역할을 한다.

Location

  • 페이지 리다이렉션
  • 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location위치로 자동 이동 (리다이렉트)
  • 응답코드 3xx에서 설명
  • 201 (Created): Location 값은 요청에 의해 생성된 리소스 URI
  • 3xx (Redirection): Location 값은 요청을 자동으로 리디렉션하기 위한 대상 리소스를 가리킴

Allow

  • 허용 가능한 HTTP 메서드
  • 405 (Method Not Allowed) 에서 응답에 포함해야함
  • Allow: GET, HEAD, PUT

Retry-After

  • 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
  • 503 (Service Unavailable): 서비스가 언제까지 불능인지 알려줄 수 있음
  • Retry-After: Fri, 31 Dec 1999 23:59:59 GMT (날짜 표기)
  • Retry-After: 120 (초단위 표기)

인증


  • Authorization: 클라이언트 인증 정보를 서버에 전달
  • WWW-Authenticate: 리소스 접근시 필요한 인증 방법 정의

쿠키


 set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure
  • HTTP는 Stateless 프로토콜이다.
  • 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.
  • 클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.
  • 쿠키를 사용자key를 받아서 사용자를 증명한다.

로그인 후 서버에서 로그인에관한 쿠키를 받으면 이후 모든 요청에서 쿠키를 자동 포함하여 요청을 보낸다.

쿠키 생명주기

  • Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
    • 만료일이 되면 쿠키 삭제
  • Set-Cookie: max-age=3600 (3600초)
    • 0이나 음수를 지정하면 쿠키 삭제
  • 세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시 까지만 유지
  • 영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지

쿠키 경로

PATH

  • 이결로를 포함한 하위 경로 페이지만 쿠키 접근
  • 일반적으로 path =/ 루트로 지정

쿠키 도메인

Domain

  • 명시: 명시한 문서 기준 도메인 + 서브 도메인 포함
    • domain=example.org를 지정해서 쿠키 생성
      • example.org는 물론이고
      • dev.example.org도 쿠키 접근

쿠키 보안

  • Secure
    • 쿠키는 http, https를 구분하지 않고 전송
    • Secure를 적용하면 https인 경우에만 전송
  • HttpOnly
    • XSS 공격 방지
    • 자바스크립트에서 접근 불가(document.cookie)
    • HTTP 전송에만 사용
  • SameSite
    • XSRF 공격 방지
    • 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송

캐시


서버에서 요청한 데이터를 매 순간 통신하여 다시 받는 것이 아닌 저장해 놓은 캐시 메모리에서 데이터를 사용하는 것 서버에서 수정이 되지 않았거나 cash 유효시간 만료전에는 캐시 데이터를 사용한다.

캐시가 없을 때

  • 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.
  • 인터넷 네트워크는 매우 느리고 비싸다.
  • 브라우저 로딩 속도가 느리다.
  • 느린 사용자 경험

캐시 적용

  • 캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.
  • 비싼 네트워크 사용량을 줄일 수 있다.
  • 브라우저 로딩 속도가 매우 빠르다.
  • 빠른 사용자 경험

캐시 시간 초과

  • 캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다.
  • 이때 다시 네트워크 다운로드가 발생한다.

검증 헤더 추가(응답)

Last-Modified

HTTP/1.1 200 OK
Content-Type: image/jpeg
cache-control: max-age=60
Last-Modified: 2020년 11월 10일 10:00:00
Content-Length: 34012

lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjklasl
kjdfl;qkawj9;o4ruawsldkal;skdjfa;ow9ejkl3123123

데이터의 최종 수정일 이다. 응답 결과를 캐시에 저장하고 Last-Modified 까지 저장한다.

조건부 요청(요청)

if-modified-since

GET /star.jpg
if-modified-since: 2020년 11월 10일 10:00:00
  • 캐시시간이 만료된 후 Last-Modified에서 받은 데이터를 조건부 요청에 넣고 요청을 보낸다.
  • 서버는 수정된 날짜를 비교하여 수정되었다면 200번을 수정되지 않았따면 300번을 보낸다.

      HTTP/1.1 200 OK
      Content-Type: image/jpeg
      cache-control: max-age=60
      Last-Modified: 2020년 11월 10일 10:00:00
      Content-Length: 34012
    
      lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjklasl
      kjdfl;qkawj9;o4ruawsldkal;skdjfa;ow9ejkl3123123
    
  • 200번 일 때 수정된 상태임으로 새로운 데이터를 body에 담아 보낸다.
    HTTP/1.1 304 Not Modified
    Content-Type: image/jpeg
    cache-control: max-age=60
    Last-Modified: 2020년 11월 10일 10:00:00
    Content-Length: 34012
    
  • 300번 일 때는 body에 데이터를 담지 않고 보낸다. client는 캐시 메모리의 데이터를 사용한다.





© 2019.04. by salmon2

Powered by theorydb