많은 개발자는 사이트에서 HTTPS를 사용하여 사용자의 데이터를 충분히 보안 할 수 있다고 생각하지만 사용자 브라우저에서 사이트 페이지를 캐싱하는 것을 종종 간과 하게 됩니다.
기본적으로 (성능을 위해) 브라우저는 HTTP 또는 HTTPS를 통해 아무 상관없이 방문한 페이지를 캐시합니다. 이 동작은 공격자가 로컬pc 에 저장된 브라우저 기록 및 브라우저 캐시를 사용하여 웹 세션 중에 사용자가 입력한 것 중, 중요한 데이터를 읽을 수 있으므로 보안 상 문제가 생깁니다. 공격자 즉 해커?가 실제 사용자의 실제 컴퓨터 (공유 장치의 경우 로컬로 또는 원격 액세스 나 멀웨어를 통해 원격으로) 사이트에 접근하는 것을 막기위해서는 HTTP 응답의 헤더 값을 통해 중요한 페이지를 캐시하지 않도록 브라우저에 알려주어야 하며, 이를 위해 아래와 같이 asp.net 에서는 전역 관리하는 global.asax 에 구현하여 쉽게 해결할 수 있습니다.
1) 프로그래밍 방식으로 global.asax 파일에 http header 설정을 구현한 방법
void
Application_BeginRequest(
object
sender, EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now);
Response.Cache.SetNoStore();
Response.Cache.SetMaxAge(
new
TimeSpan(0,0,30));
}
결과
Cache-Control:no-cache, no-store
Expires:-1
Pragma:no-cache
2) 명시적 정의 방식으로 global.asax 파일에 http header 설정을 구현한 방법
void
Application_BeginRequest(
object
sender, EventArgs e)
{
Response.AddHeader(
"Cache-Control"
,
"max-age=0,no-cache,no-store,must-revalidate"
);
Response.AddHeader(
"Pragma"
,
"no-cache"
);
Response.AddHeader(
"Expires"
,
"Tue, 01 Jan 1970 00:00:00 GMT"
);
}
결과
Cache-Control:max-age=0,no-cache,no-store,must-revalidate
Expires:Tue, 01 Jan 1970 00:00:00 GMT
Pragma:no-cache