HTTP 헤더는 HTTP 전송에 필요한 모든 부가 정보를 담기 위해 존재한다.
표준헤더도 많이 존재하지만, 필요시 임의의 헤더도 만들 수 있다.
HTTP 표준 규격의 등장으로
표현 = 표현 메타데이터 + 표현 데이터
메세지 본문(페이로드) 을 통해 표현 데이터를 전달한다.
표현은 요청이나 응답에서 전달할 실제 데이터
표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공함 (데이터 유형, 데이터 길이, 압축 정보 등)
표현 헤더는 전송, 응답 둘다 사용 가능하다.
클라이언트가 선호하는 표현 요청
Quality Values(q) 값 사용
0~1 클수록 높은 우선순위 (생략 시 1)
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
1. ko-kr = 1
2. ko;q = 0.9
3. en-US;q = 0,8
4. en;q = 0.7
구체적인 것을 우선함.
Accept: text/*, text/plain, text/plain;format=flowed, */*
1. text/plain;format=flowed
2. text/plain
3. text/
4. /*
구체적인 것을 기준으로 미디어 타입을 맞춘다.
Accept: text/*;q=0.3, text/html;q=0.7, text/html;level=1,text/html;level=2;q=0.4, */*;q=0.5
1. text/html;level = 1
2. text/html = 0.7
3. text/plain = 0.3
4. image/jpeg = 0.5
5. text/html;level=2 = 0.4
6. text/html;level=3 = 0.7
단순 전송 : Content-Length 를 알 때 일반적으로 보내주는 것
압축 전송 : Content-Encoding 을 알려줘야함
분할 전송 : Transfer-Encoding: chunked, 전체 길이를 예측할 수 없음
범위 전송 : Range로 요청하고, Content-Range 로 응답함
HTTP는 무상태 프로토콜이기 때문에,
클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.
클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.
이를 쿠키를 사용하지 않고 해결하려면 모든 요청과 링크에 사용자 정보를 포함해야하지만 이는,
모든 요청에 사용자 정보가 포함해야한다..
쿠키는 항상 서버에 전송되므로, 네트워크 추가 트래픽을 유발한다.
그러므로 최소한의 정보만 사용하고, 보안에 민감한 데이터는 저장하지 않는다.
ex) set-cookie: sessionId=abcde1234; expires=Sat, 26-Dec-2020 00:00:00 GMT; path=/; domain=.google.com; Secure
쿠키 생명 주기, Expires, max-age
쿠키 도메인, domain
명시한 문서 기준 도메인 + 서브 도메인까지 포함한다.
생략시 현재 문서 기준 도메인만 적용된다.
쿠키 경로, path
설정한 이 경로를 포함한 하위 경로 페이지만 쿠키 접근한다.
일반적으로 path=/ 루트페이지
로 지정한다.
쿠키 보안, Secure, HttpOnly, SameSite
캐시가 없을 때
데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.
브라우저 로딩 속도가 저하되고, 느린 사용자 경험을 제공하게 된다.
캐시 적용시
캐시 덕분에 캐시가 살아있는 동안에 같은 데이터를 위해 네트워크를 사용하지 않아도 된다.
캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다.
캐시가 만약 시간이 초과 되어서 서버에서 다시 요청한다면?
1번의 경우 데이터를 새로 받지 않고 저장해 두었던 캐시를 다시 사용한다면 참 좋을것이다..
하지만 이를 위해 캐시와 서버의 데이터가 같다는 것을 확인해야 한다.
이를 위해 If-Modified-Since를 추가 한다.
쿠키가 만료되었을때, 서버의 Last-Modified와 비교하여 같은 데이터인지 확인한다.
같은 데이터일시 304 응답과 함께, 바디 부를 제하고 헤더만 전송하여 클라이언트가 가지고 있는 데이터를 재사용한다.
Last-Modified, If-Modified-Since 의 단점
ETag
캐시용 데이터에 임이의 고유한 버전 이름을 달아둠
데이터가 변경되면 이 이름을 바꾸어서 변경함(Hash를 다시 생성)
ETag만 비교해서 같으면 유지한다.
로직은 위와 같다.
캐시를 적용하지 않더라도 웹 브라우저들이 GET 요청시 임의로 캐시를 해버린다.
캐시가 되면 안되는 민감한 정보들을 정말 캐시가 되지 않게 설정해주어야 한다.
Cache-Control: no-cache, no-store, must-revalidate, + Pragma: no-cache
no-cache가 있는데 must-revalidate가 왜 필요할까?
no-cache는 위 그림과 같은 순간에 프록시 캐시의 데이터를 보여줄 수도 있어서,
좀 더 보수적인 설정을 위해 504 에러를 터뜨리는 must-revalidate가 필요하다!