사용자가 로그 아웃 후 이전에 방문한 보안 페이지를 보지 못하도록 방지


99

최종 사용자가 로그 아웃 / 로그 아웃 후 제한된 페이지로 돌아갈 수 없어야한다는 요구 사항이 있습니다. 그러나 현재 최종 사용자는 브라우저 뒤로 버튼을 사용하거나 브라우저 기록을 방문하거나 브라우저의 주소 표시 줄에 URL을 다시 입력하여이를 수행 할 수 있습니다.

기본적으로 최종 사용자가 로그 아웃 후 어떤 방식 으로든 제한된 페이지에 액세스 할 수 없어야합니다. 어떻게하면 최선을 다할 수 있습니까? JavaScript로 뒤로 버튼을 비활성화 할 수 있습니까?


7
Post-request-get 패턴을 사용하세요.

답변:


137

당신은 하고 안 할 수 는 브라우저의 뒤로 버튼이나 역사를 해제합니다. 사용자 경험에 좋지 않습니다. JavaScript 해킹이 있지만 신뢰할 수 없으며 클라이언트가 JS를 비활성화 한 경우에도 작동하지 않습니다.

구체적인 문제는 요청 된 페이지가 서버에서 직접로드되지 않고 브라우저 캐시에서로드되었다는 것입니다. 이것은 본질적으로 무해하지만 실제로 최종 사용자에게는 혼란 스럽습니다. 왜냐하면 실제로 서버에서 나온 것이라고 잘못 생각하기 때문입니다.

제한된 모든 JSP 페이지를 캐시 하지 않도록 브라우저에 지시하기 만하면됩니다 (따라서 로그 아웃 페이지 / 액션 자체 만이 아닙니다!). 이렇게하면 브라우저가 캐시 대신 서버에서 페이지를 요청해야하므로 서버의 모든 로그인 검사가 실행됩니다. 메소드 에서 필요한 응답 헤더 를 설정 하는 필터 를 사용하여이를 수행 할 수 있습니다 .doFilter()

@WebFilter
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        response.setDateHeader("Expires", 0); // Proxies.

        chain.doFilter(req, res);
    }

    // ...
}

예를 들어 관심 Filter있는 url-pattern에 매핑하십시오 *.jsp.

@WebFilter("*.jsp")

또는이 제한을 보안 페이지에만 적용하려면 모든 보안 페이지를 포함하는 URL 패턴을 지정해야합니다. 예를 들어 모두 폴더에있는 /app경우 URL 패턴을 지정해야합니다 /app/*.

@WebFilter("/app/*")

더군다나이 일을 똑같이 할 수 있습니다 Filter또한 로그인 한 사용자의 존재를 확인하는 .

테스트하기 전에 브라우저 캐시를 지우는 것을 잊지 마십시오! ;)

또한보십시오:


2
때로는 이것으로 충분하지 않습니다. 그런 문제가 있었던 것을 기억합니다. 브라우저는 마지막 페이지 만 기억합니다. 하지만 IE6 일 수도 있습니다. 기억할 수 없습니다. :)
Bozho

3
@Bozho : 불완전한 헤더 세트를 제공했거나 브라우저의 페이지가 여전히 캐시에 있습니다.
BalusC 2010

1
@Chris : Firefox 및 기타 모든 브라우저에서 작동합니다. 문제는 다른 곳에서 발생합니다. 캐시를 지우는 것을 잊었나요? 아니면 해당 헤더가 잘못된 응답에 설정되어 있습니까?
BalusC 2013

@BalusC doFilter()메서드 를 재정의하기 위해 별도의 Filter 클래스를 만들었습니다 . 로그 아웃 버튼을 누르면 세션을 무효화하는 서블릿으로 리디렉션됩니다. 이 doFilter()방법이 여기서 어떻게 작동하는지 잘 모르겠습니다 . 이것을 구현하는 방법을 알려주시겠습니까? 에서와 같이 따라야 할 올바른 단계. 감사.
Anjan Baradwaj

나를 위해 잘 작동했습니다. 모두 후 테스트 sendRedirect(...)forward().
Hal50000

5

* URL 패턴의 .jsp는 페이지를 전달하면 작동하지 않습니다. 서블릿도 포함 시키십시오. 그러면이 뒤로 버튼 문제로부터 애플리케이션을 안전하게 보호 할 수 있습니다.


2

브라우저를 다시 비활성화하지 않고이를 수행하는 가장 간단한 방법은 page_load로그 아웃 후 사용자가 다시 돌아 가지 않도록하려는 페이지 의 이벤트에 다음 코드를 추가하는 것입니다.

if (!IsPostBack)
    {
        if (Session["userId"] == null)
        {
            Response.Redirect("Login.aspx");
        }
        else
        {
        Response.ClearHeaders();
        Response.ClearContent();
        Response.Clear();
        Session.Abandon();
        Session.Remove("\\w+");
        Response.AddHeader("Cache-Control", "no-cache, no-store, max-age = 0, must-revalidate");
        Response.AddHeader("Pragma", "no-cache");
        Response.AddHeader("Expires", "0");
        }
    }

6
귀하의 답변은 유용하지만 OP의 프로그래밍 언어와 관련된 답변을 게시하십시오. C # 솔루션은 OP의 Java EE 프로젝트에 도움이되지 않습니다.
Buhake Sindi

0

브라우저에 홈페이지를 캐시하지 않도록 지시 할 수 있습니다 (적절한 헤더 (Expires, Cache-Control, Pragma) 사용). 그러나 작동이 보장되지는 않습니다. 할 수있는 일은 페이지로드시 서버에 ajax 호출을 수행하여 사용자가 로그인되었는지 확인하고 그렇지 않은 경우 리디렉션하는 것입니다.


13
그러나 악한 마음이 JavaScript를 비활성화하면 작동하지 않으며 그럼에도 불구하고 페이지를 볼 수 있습니다.
acme

0

이를 수행하는 올바른 방법은

Vary: Cookie

보안 페이지의 헤더. 사용자가 로그 아웃하면 세션 쿠키를 지 웁니다. 그런 다음 로그 아웃 한 후 다시 탐색하면 브라우저 캐시가 누락됩니다. 이것은 또한 캐싱을 완전히 무효화하지 않는 이점이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.