ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTTP 헤더 정보 , 캐시
    개발/프로그래밍 2022. 3. 21. 12:40

    일반 헤더

    HTTP 전송에 필요한 모든 부가정보가 헤더에 들어간다.

    과거에는(RFC2616) 헤더에 이런 정보들이 포함되어 있었다.

    1. 메시지 전체에 적용되는 정보,

    2. 요청정보(브라우저정보),

    3.응답정보,

    4.바디(엔티티)정보(contentType,length)

     

    2014년 이후 RFC7230이 등장했고

    메시지에 들어가는 정보가 표현(Representation) 데이터 와 표현 헤더라 불리게 되었다.

    표현이란 데이터를 “HTML이라는 표현으로 전달할지 json 표현으로 전달할지” 같은 표현을 말한다.

    표현데이터는 요청 및 응답에서 전달할 실제 데이터 이며

    표현 헤더는 이 표현 데이터를 해설 할수있는 정보를 제공

     

    협상헤더

    클라이언트가 원하는 표현을 요청하는것을 협상헤더라 한다. (미디어타입,문자,압충,자연어)

    GET /event
    Accent-Language : ko
    

    위와같이 한국어로 요청하면 한국어로 응답이 오게함 (서버가 지원해줄시)

    GET /event
    Accent-Language : ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
    

    만약 지원하지 않는 경우를 고려한다면 이렇게 우선순위를 q 를 통해 표현한다 (0~1사이값) , q생략시 1.0으로 표현됨

    전송정보

    단순전송

    압축전송 - Content-Encoding : gzip 이추가되고 Length가 줄어들음

    분할전송 - Transter-Encoding: chunked 이 추가됨 , 데이터를 잘라서 전송함 , Length를 보내면안됨

    범위전송 - 파일을 받다가 다시받을때 이어받기할때 사용, Content-Range: 1001~2000/2000

    일반정보

    referer : 이전 페이지 정보 ,유입경로파악용

    user-agent : 클라이언트 애플리케이션 정보, 어느 브라우저에서 문제가 생기는지 확인가능 , 통계정보

    특수정보

    host : 하나의 IP에서 여러 도메인을 사용할때 어느 도메인에 요청할지 결정하기 위해 필요한 필수값이다.

    GET /hello HTTP/1.1
    Host: www.aaa.com
    

    Location : 3xx응답코드 결과에 Location 헤더가 있으면 리다이렉션

    쿠키

    HTTP는 Stateless한 프로토콜이다.(클라이언트 상태를 기억하지 않음)

    하지만 유저가 로그인을 한 후 다시 접속했을때 로그인한 상태를 저장하기 위해서는 상태가 필요하다.

    그래서 쿠키가 필요하다.

     

    로그인 완료시

    요청
    POST /login HTTP/1.1
    user=홍길동
    
    응답
    HTTP/1.1 200 OK
    Set-Cookie: user= 홍길동
    

    이후에 클라이언트는 쿠키 저장소에 user=홍길동을 저장한다.

    이후 요청시 모든요청에 쿠키정보를 자동으로 포함한다.

    GET /users HTTP/1.1
    Cookie : user=홍길동
    

     

     

    캐시 기본동작

    데이터를 받을때마다 매번 받아야하므로 비싸고 느려진다. 

    cache-control : max-age=60

    캐시정보를 헤더에넣어주면 60초간 응답 결과를 저장하며 60초 내에서는 네트워크를 요청하지 않고 캐시에서 가져오게 된다.

    검증 헤더와 조건부 요청

    하지만 만약 60초 이후에도 받으려는 데이터가 똑같다면 굳이 다시 받는게 비효율적이라 볼수도 있다.

    만약 바뀌지 않았음을 검증할수 있다면 60초 이후에도 캐시를 다시 사용할수 있을것이다.

    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
    
    바디....
    
    

     

      클라이언트는 응답받은 데이터와 함께 최종 수정일(Last-modified)을 캐시에 저장해준다.

    Last-modified 를 검증헤더라 한다.

    검증헤더란 캐시에 들어있는 데이터와 응답 받을 서버 데이터가 같은지 검증하는 헤더이다.

    이제 60초후 요청을 보낼ㄱ때 이렇게 보낸다

    GET /star.jpg
    if-modified-since: 2020년11월10일 10:00:00
    
    

    if-modified-since 를 조건부 요청이라 한다.

    서버에서 비교후 수정되지 않았으면 이렇게 응답한다

    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
    

     

    만약 Last-modified 가 같을시 위와같이 바디가 없이 헤더만 응답으로 온다.

    그러면 클라이언트에서 캐시를 다시 세팅후 캐시 데이터를 사용한다.

     

    하지만 Last-modified 검증헤더의 단점은 캐시 유효기간이 1초 미만 단위 설정이 안되는점

    그리고 같은 데이터를 날짜만 바뀐경우 데이터를 다시 받아야한다는 단점이 있다.

    Etag를 사용하면 이 단점이 커버가된다.

    Etag는 hash값을 사용하는데 데이터가 변경되면 hash가 변경된다.

    HTTP/1.1 200 OK
    Content-Type:image/jpeg
    cache-control : ma-age=60
    Etag : "aaaaaaaa"
    Content-Length: 34012
    
    GET /star.jpg
    if-None-Match:  "aaaaaaaa"
    
    

    태그가 같으면 데이터가 수정되지 않았음을 검증할수있다. 캐시 제어 로직을 서버에서 완전히 관리하게 된다.

     

    '개발 > 프로그래밍' 카테고리의 다른 글

    클린 아키텍쳐 , 레이어드 아키텍쳐  (0) 2022.05.05
    Swift 코드로 SOLID 이해하기  (0) 2022.05.01
    인터넷 네트워크 TCP/IP  (0) 2022.03.16
    메모리 구조 (code,data,stack,heap)  (0) 2021.11.14
    객체지도  (0) 2021.11.07

    댓글

Designed by Tistory.