재우니의 블로그


많은 개발자는 사이트에서 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