HTTP02
in Web on Web, Http
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도 쿠키 접근
- domain=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는 캐시 메모리의 데이터를 사용한다.