HTTP 웹 캐싱이란?
HTTP 웹 캐싱은 서버가 중복적인 요청을 했을 때 상태값이나 식별이 가능한 유용한 데이터를 저장하여, 또 다시 동일한 데이터의 통신을 하지 않게끔 유도하여, 웹 성능을 최적화하는 기술 중 하나이다. 이를 통해 네트워크 대역폭을 줄이고 웹 페이지 로딩 속도를 향상시키는 데 목적이 있다.
🔹 웹 캐싱의 주요 유형
- 브라우저 캐시 (Browser Cache)
- 사용자의 웹 브라우저가 방문한 페이지의 정적 리소스(이미지, CSS, JavaScript 등)를 저장하여 동일한 요청 시 다시 다운로드하지 않도록 하는 방식으로, 이를 통해 동일한 사이트를 재방문할 때 빠르게 로딩할 수 있다.
- 프록시 서버 캐시 (Proxy Server Cache)
- 중간 서버(프록시 서버)가 서버와 클라이언트 사이에서 데이터를 캐싱하여 여러 사용자가 동일한 요청을 할 때 응답 속도를 개선하는 방식으로, 기업 내부 네트워크 또는 ISP(Internet Service Provider, KT같은 곳)에서 주로 사용된다.
AWS 로 치면, LoadBalancer 같은 느낌..
- 중간 서버(프록시 서버)가 서버와 클라이언트 사이에서 데이터를 캐싱하여 여러 사용자가 동일한 요청을 할 때 응답 속도를 개선하는 방식으로, 기업 내부 네트워크 또는 ISP(Internet Service Provider, KT같은 곳)에서 주로 사용된다.
- CDN 캐시 (Content Delivery Network Cache)
- CDN 서버가 전 세계 여러 지역에서 자주 요청되는 콘텐츠를 캐싱하여 사용자에게 더 가까운 서버에서 제공하는 방식으로, 이미지, 동영상, 정적 파일 등을 효율적으로 배포하기 위해 사용된다.
🔹 그러나 주의해야 할 점 (보안 문제)
성능을 향상시킬지 몰라도, 성능보다 더 중요한 사항이 있다. 바로 `보안` !!
예를들어 로그인 정보, 결제 카드 정보와 같은 민감한 데이터가 캐싱돼서는 안될 것이다.
이러한 경우를 대비해서 HTTP 에서 제공하는 헤더가 있다.
바로 Cache-Control: no-store 헤더이다.
이 헤더를 사용하여 브라우저나 프록시 서버가 특정 응답을 절대 캐싱하지 않도록 설정할 수 있다.
🔹 웹 캐싱 사용 방법 : HTTP Response(응답)의 헤더 활용
웹 캐싱은 HTTP Response 헤더를 활용하여 사용이 가능하다.
다음은 그 헤더의 대표적인 유형이다.
- Cache-Control
- 캐싱 정책을 지정한다.
- [정책 종류]
- public → 누구나 캐시 가능
- private → 브라우저에서만 캐시 가능
- no-cache → 항상 서버에 검증 요청 필요
- no-store → 캐싱 금지 (보안 데이터 보호)
- max-age=3600 → 1시간 동안 캐싱 유지
- ETag (Entity Tag)
- 리소스의 고유한 식별자를 제공하여 변경 여부를 확인하는 역할을 한다. 이때 주어지는 고유한 식별지는 해쉬코드이며, 서버는 (클라이언트의 요청에 의해서) 응답을 보낼 때, ETag 값을 응답 헤더에 포함한다. 이때 ETag 값은 무작위 해쉬코드이다.
- 이제 클라이언트의 두번 째 요청부터는, 기존 첫 요청때 응답 받았던, ETag 값을 If-None-Match 요청 헤더에 값을 복사해서 보내면, 서버가 ETag를 비교하여 변경되지 않았다면 304 (Not Modified)를 반환하여 불필요한 데이터 전송을 방지한다.
- If-None-Match 말고도 (조금 더 정밀성이 떨어지긴 하지만) If-Modified-Since 헤더도 있다. 이 헤더에는 마지막 수정 시간을 이용하여 날짜를 기반한 변경 여부 비교를 한다.
- Expires
- 특정 날짜와 시간을 지정하여 캐시 만료 시점을 설정하는 방식이다.
- 그러나 최신 웹에서는 Cache-Control: max-age가 더 자주 사용된다.
✅ 결론
HTTP 웹 캐싱은 네트워크 트래픽을 줄이고 웹 성능을 최적화하는 유용한 기술이지만,
보안 문제를 고려하여 민감한 데이터는 캐싱되지 않도록 주의해야 하며,
이를 활용하기 위해 Cache-Control, Etag, Expires 등의 HTTP 응답 헤더를 사용할 수 있다. 🚀
'WEB > HTTP' 카테고리의 다른 글
[CSS] 버튼 이쁘게 꾸미는 다양한 방법 (0) | 2021.06.15 |
---|---|
[CSS] 배경색 그라데이션 넣는 속성 (0) | 2021.06.14 |
[CSS] div 테두리 둥글게 만들기 + 테두리에 그림자 넣기 (0) | 2021.06.14 |