Programming

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

procodes 2020. 8. 20. 20:25
반응형

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


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

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


당신은 하고 안 할 수 는 브라우저의 뒤로 버튼이나 역사를 해제합니다. 사용자 경험에 좋지 않습니다. 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또한 로그인 한 사용자의 존재를 확인하는 것과 동일한 작업을 수행 할 수 있습니다 .

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

또한보십시오:


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


브라우저를 다시 비활성화하지 않고이를 수행하는 가장 간단한 방법은 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");
        }
    }

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


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

Vary: Cookie

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

참고URL : https://stackoverflow.com/questions/4194207/prevent-user-from-seeing-previously-visited-secured-page-after-logout

반응형