본 내용은 인프런, 김영한님의 모든 개발자를 위한 HTTP 강의를 듣고 작성한 문서입니다.
용도
- HTTP 전송에 필요한 모든 부가 정보 ex) 메시지 바디의 내용, 크기, 압축 인증, 서버 정보 등등..
- 필요시 임의의 헤더도 추가 가능
RFC723x
- 과거 엔티티라 표현했던 것을 표현 (Representation)으로 바꿈
- 표현 = 표현 메타데이터 + 표현 데이터
- Representation 의 R 은 REST의 R
HTTP BODY
여기서, Content-xxx 표현헤더
메시지 본문이 표현 데이터
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3000
<html>
...
</html>
- 메시지 본문을 통해 표현 데이터를 전달한다.
- 메시지 본문은 페이로드(payload)
- 표현은 요청이나 응답에서 전달할 실제 데이터 (리소스?)
- 표현 헤더는 표현 데이터를 해석할 수 있는 정보 제공(json, html, 길이.. 등등)
표현
- Content-Type : 표현데이터의 형식(text, html, json.. 요즘엔 json이 대부분)
- Content-Encoding: 표현 데이터의 압축 방식
- Content-Language: 표현데이터의 자연언어 (한국어, 영어...)
- Content-Length: 표현 데이터의 길이
- 표현 헤더는 전송, 응답 둘다 사용한다
1. Content-Type
- 미디어 타입, 문자 인코딩 등등 .. img도 표시
2. Content-Encoding
- 표현데이터를 합축하기 위해 사용 ex) gzip, deflate..
- 너무 큰 데이터를 한번에 전송할 때 사용,
- 어떤 형식인지 알려줘야 그거에 맞게 압축을 풀 수 있다
- 1/2 이상까지 압축을 해준다.
3. Content-Language
- 표현 데이터의 자연언어를 표현..
- 메시지 본문에 한글이냐 영어냐..
4. Content-Length
- 바이트 단위로 표시
- Transfer-Encoding (분할전송?) 할 떄는 사용 하면 안됨
협상 (콘텐츠 네고시에이션)
클라이언트가 원하는걸로 서버에 요청을 한다.
우선순위 실행이 가능하다.
단, 서버측에서 알고 있어야 한다. (이런 타입...? 들을..?)
협상 헤더는 요청(Request)시에만 사용 가능하다
- Accept : 클라이언트가 선호하는 미디어 타입 전달
- Accept-Charset : 클라이언트가 선호하는 문자 인코딩
- Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
- Accept-Language : 클라이언트가 선호하는 자연언어
Accept-Language?
accept-language 를 사용하기 전에는, 한국어 브라우저를 사용해도 서버측에서 기본이 영어로 되어 있으면 그냥 영어로 답이 왔다.
accept-language 를 적용하면, 브라우저에서 Accept-Language: ko
로 요청을 한다면 서버에서 한국어로 바로 보내준다.
그런데 만약에 서버가 기본 독일어, 그 외에는 영어밖에 없는데 한국브라우저를 사용한다면?
일단은 Accept-Language: ko
로 요청을 보내도 독일어로 오게 된다.. 기본이 독일어기 때문에..
만약, 한국어가 없을 때 두번째로 영어를 원한다면 우선순위를 지정해준다.
GET /event
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
이런식으로 지정해 주면 점수가 높은 것에 따라 언어를 보내주게 된다. (1 생략가능, 여기서는 KR이 1등)
만약 점수가 없으면.. 구체적으로 적은것을 우선한다.
GET /event
Accept: text/*, text/plan, text/plan;format=flowed,*/*
이런 경우에는 가장 구체적인
1순위 text/plan;format=flowed
2순위 text/plan
3순위 text/*
4순위 */*
이렇게 된다.
전송방식
1. 단순전송
- 단순하게 그냥 Content-Type, Content-Length 로 전송
- 이미 바디에 길이가 어떻게 되는지 타입이 뭔지 알고 있음
2. 압축전송
Content-Encoding: gzip
이런 식으로 압축해서 전송- 바디의 용량이 줄어든다
3. 분할전송
-
이런식으로 나눠서 전송 (5글자씩 잘라서 ... 양이 많으면..)HTTP/1.1 200 OK Content-Type: text/plan Transfer-Encoding chunked 5 hello 5 world 0 \r\n
- 한번에 보내기에 큰 경우 이런식으로 보낸다
- 이 경우에는 Content-Length를 보내면 안된다 분할이라 전체 크기를 모름
4. 범위전송
- 서버에서 데이터를 보내줬는데 중간에 끊겼을 경우 처음부터 다시 받는건 좀 별로니까 그 뒤로 range 정해서 받을 수도 있음
Content-Range: bytes 1001-2000/2000
이렇게 보내줌
일반정보
1. From
- 유저 에이전트의 이메일 정보
- 일반적으로 잘 사용되지 않음
- 요청에서 사용
2. Referer
- 현재 요청된 페이지의 이전 웹 페이지 주소
- Referer를 사용해 유입 경보 준석 가능
- 요청에서 사용
3. User-Agent
- 클라이언트 애플리케이션 정보 (웹 브라우저 정보...등등)
- 어떤 종류의 브라우저에서 장애가 발생하는지 파악가능
- 요청에서 사용
4. Server
- 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
- 응답에서 사용
5. Date
- 메시지가 발생한 날짜와 시간
- 응답에서 사용
특별한 정보
1. HOST
- 필수헤더
- 요청한 호스트 정보(도메인)
- 하나의 서버가 여러 도메인을 처리해야 할 때 사용
- 하나의 IP 주소에 여러 도메인이 적용되어 있을 떄..
이 때, Host 정보로 어디 사이트인지 알아낼 수 있다.
- ex) 10.0.0.10 서버에 a 사이트, b 사이트 c 사이트가 올라가 있는데 /login 요청이 들어오면 어디 사이트의 요청인지 모름
2. Location
- 페이지 리다이렉션 때 사용
- 3xx 응답결과에 Location 헤더가 있으면 Location 위치로 자동 이동 (리다이렉트)
- 201응답에서는 생성된 리소스의 URI
3. Allow
- 허용 가능한 HTTP 메서드 405응답에 포함해야함
- GET, HEAD, PUT
4. Retry-After
- 503응답시에 서비스가 언제까지 불능인지 알려줄 수 있음
- 날짜나 남은 초단위 시간으로 표기한다.
인증
1. Authorization
- 클라이언트 인증 정보를 서버에 전달
Authorization: Basic xxxxxxxx
2. WWW-Authenticate
- 리소스 접근시 필요한 인증 방법 정의
- 401 Unauthorized 응답과 함께 사용
- 401 에러가 날 때 함께 정보를 보내줘서 어떤 인증이 필요한지 알려줘야함
쿠키
만약 쿠키를 사용하지 않았을 경우?
로그인을 한 유저와 안한 유저를 구분하지 못함
이 유저를 구분하기 위해 항상 쿼리스트링으로 유저에 대한 정보를 보내줘야한다.
쿠키를 사용하면?
브라우저에서 로그인을 하면 서버측에서 헤더에 Set-Cookie: user=홍길동
과 같은 정보를 담아 응답을 보낸다.
그럼 브라우저에 쿠키가 자동저장되고, 그 다음 요청부터 Cookie: user=홍길동
을 항상 포함하여 보내게 된다.
쿠키의 사용처
- 사용자 로그인 세션 관리
- 광고 정보 트래킹
쿠키 정보는 항상 서버에 전송된다
- 네트워크 트래픽 추가 유발
- 세션 id나 토큰 등 최소한의 정보만 사용해서 쿠키를 저장해야한다
- 서버에 전송하지 않고 싶은 정보들
- 보안에 민감한 데이터는 저장하면 안됨
쿠키 - 생명주기
- expires=... 날짜
- 만료일이 되면 쿠기 삭제
- Set-Cookie= max-age=3600 -> 3600 초 지정
- 세션 쿠키 : 만료날짜를 생략하면 브라우저 종료시까지만 유지
- 영속 쿠키 : 만료날짜를 입력하면 해당 날짜까지 유지
쿠키 - 도메인
- 도메인을 지정해서 쿠키를 생성하면 명시한 도메인 + 서브도메인 도 쿠키 접근 간으
- 도메인을 생략하면 만들어진 도메인에서만 쿠키 접근 가능
쿠키 - 경로
- path=/home 이런식이라면
- 이 경로를 포함한 하위 경로 페이지만 쿠키 접근 가능 (/home는 못감)
쿠키 - 보안
- Secure
- 쿠키는 http, https 를 구분하지 않고 전송
- Secure를 지정하면 https인 경우에만 전송
- HttpOnly
- XSS 공격방지
- 자바스크립에서 접근 불가
- HTTP 전송에만 사용
- SameSite
- XSRF 공격방지
- 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송
'강의정리 > 모든개발자를위한HTTP웹기본지식' 카테고리의 다른 글
HTTP 상태코드 요약 (0) | 2022.08.11 |
---|---|
클라이언트에서 서버로 데이터 전송 (0) | 2022.08.11 |
HTTP API를 만들어 보자 (0) | 2022.08.11 |
HTTP (0) | 2022.08.11 |
URI (0) | 2022.08.10 |
댓글