다음처럼 post page에서 게시글을 view 하는 것을 계속 구현하고 있다.
구현하다가 똑같은 게시글 url을 여러번 요청하면서 왠지 저장해두고 여는게 좋지 않을까란 생각이 들었다..
평상시에도 기술 포스팅 문서나 뉴스도 한 번 볼 때 여러 게시글을 동시에 보거나,
하루동안 자꾸 똑같은 게시글을 여러번 보게 되는 경우가 많다.
일단 브라우저에 데이터 저장하는 방법은 다음 몇 가지가 있다.
브라우저에 저장되는 작은 크기의 문자열이라고 한다.
웹 서버에 의해 만들어져서 서버가 response header에 Set-Cookie 옵션을 설정하면 브라우저에 저장된다고 한다.
내용의 업데이트 시점은 사용자가 Cookie를 생성한 url에 접속할 때마다 브라우저에서 HTTP Cookie 헤더에 Cookie 내용을 같이 보낸다고 한다.
인증과 관련되어서 사용한다는 것으로 보인다.
( 세션 관리, 개인화, 트래킹 등 )
로그인 상태를 유지하는 것이 예시인 것으로 보인다.
web storage object로 브라우저 내에 key-value pair를 저장할 수 있다. Map과 유사하게 관리된다고 한다. (setItem/getItem/removeItem과 같은 method를 제공해서란다.)
브라우저를 다시 실행해도 데이터가 남아있는다.
origin이 같으면 모든 탭과 창에서 공유된다고 한다.
심지어 OS가 재시작해도 데이터가 파기되지 않는다는 것으로 보아, 보안과 디스크 용량에도 신경을 써야할 것으로 보인다.
음.. 사용처는 아무래도 session storage와 비슷할 것으로 보인다. 다만 브라우저가 꺼져도 계속 저장되었으면 하는 예시는...음... 장바구니 정보?
고갱님이 매일을 오래 고민하셔도 사셨으면 좋겠는데 장바구니 담은 내역을 서버는 안 되겠고 고갱님의 storage를 쓰면...나쁘지 않지 않을까..^^?
페이지를 새로 고침해도 남아있는다.
현재 떠 있는 탭 내에서만 유지된다는데.. 그래서 탭이나 브라우저를 종료하면 사라진다고 한다.
생각보다 제한적이라서 local storage에 비해 자주 사용되지 않는다고 한다.
사용처는 드는 생각으로 회원가입이나 쇼핑하다가 결제페이지에서 실수로 뒤로가기 누른 날들이 생각난다... 그런데 지워져버렸을 때 너무 슬펐는데 앞으로 가기하면 저장이 되어있었는데.. 이 기능일거라는 느낌이 든다!!
회원가입했는데 가입정보를 계속 브라우저에 둘 필요가 없다! (로그인이랑 다르다)
결제페이지에서 주소 입력한 정보도 일회성이라고 생각된다(물론 서버에 최근 배송지를 저장하는건 다른 행위이다)
" 입력 중 " 일 때 특별한 이유로 잠깐 저장하고 복원하기엔 안성맞춤으로 보인다.
HTTP response 에 Cache-Control header가 있다고 한다. 리소스 (HTML, CSS, JS, image, video ... )의 생명 주기를 결정해주는 헤더라고 한다.
cache가 유효하면 재사용하고 만료되었으면 서버에 요청을 보낸다고 한다. 한 번 저장되면 만료될 때까지 캐시가 남는다.
max-age
Revalidation
no-cache
no-store
public/private
브라우저 web storage object에 저장하려고 사실 알아보았다.
적용한다면 local storage에 유효기간을 1일로 하고 5개정도 적용할지에 대해 고민해보았으나,
그러나 다음 이유로 해당 내용보다 다른 내용을 알아보아야 겠다고 생각했다.
결론적으로 private browser cache가 적합한 것 같다.
post는 항상 바뀔지 모르니 no-cache로 설정해서 캐시를 활용하면 좋을 거 같다.
일단 적용 해보기로 했다.
response.setHeader('Cache-Control', 'private, max-age=60');
그러나 url을 서버 갱신이 되었는지 확인도 안 하고 쓰면 내용이 업데이트 되어도 확인할 수 없을 것이다.
response.setHeader('Cache-Control', 'private, no-cache');
// res.status(code): Sets the HTTP status for the response.
return response.status(200).json(post);
그렇다면, ETag가 같은지 서버에서 확인해야하는데 express response header에 보내기도 전에 있을린 없다. 그래서 직접 만들려고 했었으나 다른 방법을 쓰기로 했다.
최종적으로 적용한 코드는 다음처럼 설정하였다.
response.setHeader('Cache-Control', 'private, no-cache');
if (req.headers['if-modified-since'] === new Date(post.released_at).toUTCString()) {
return response.status(304).send();
}
response.setHeader('Last-Modified', new Date(post.released_at).toUTCString());
return response.status(200).json(post);
Thender client로 서버 API만 테스트했을 때 304가 나온다.
실제 서비스에서 cache를 이용하여 url 로딩이나 정적 리소스를 재활용하려고 하면 어찌되었든 사용자에게 동의를 구해야할 것으로 보인다. 뭔가 저장하는거니 수집이 되는 것이니까...?
그래서 여러 사이트에 들어가면 동의를 구하는 팝업이 계속 뜨는 걸 볼 수 있다.
(22.01.25 수정)
ETag에 대해 좀 더 정리한 자료를 올려두었다.
https://velog.io/@coolchaem/HTTP-header-ETag