스프링시큐리티 로그인 성공 시 이전 페이지로 이동

24.02.04 11:10 작성 24.02.04 11:12 수정 조회수 346

0

모든 페이지 헤더에 로그인 버튼이 있어 어느 페이지에서도 로그인할 수 있도록 프로젝트를 구상했습니다. 이때 스프링 시큐리티에서 로그인 성공 시 로그인을 시도한 (즉 로그인 이전 페이지)페이지로 이동하도록 하고 싶은데, 스택오버플로우 등을 참고해서 작성해봤는데 제대로 실행하지 않아서 어떻게 하면 되는지 여쭤보고 싶습니다.

세션에 마지막 페이지 주소를 add해서 로그인 시 세션 내용을 읽고 그곳으로 보내는 방식이 아니라, 세션 사용 없이 그냥 이전 페이지로 돌려보낼 수 있는 방법은 없을까요?

 

이하는 작성했는데 제대로 실행되지 않았던 제 config 코드와 참고한 스택오버플로우 링크입니다.

https://stackoverflow.com/questions/26833452/spring-boot-redirect-to-current-page-after-successful-login

@Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((authorizeRequests) -> authorizeRequests
                        .requestMatchers(new AntPathRequestMatcher("/**")).permitAll())
                .csrf(csrf -> csrf.disable());

        http.formLogin(login -> login
                .loginPage("/login")
                .usernameParameter("username")
                .passwordParameter("password")
                .loginProcessingUrl("/login_process")
                .defaultSuccessUrl("/")
                .successHandler(successHandler())
                .permitAll());

        http.logout(logout -> logout
                .logoutUrl("/logout")
                .permitAll()
                .logoutSuccessHandler(logoutSuccessHandler()));
        return http.build();
    }

    @Bean
    public AuthenticationSuccessHandler successHandler() {
        SimpleUrlAuthenticationSuccessHandler handler = new SimpleUrlAuthenticationSuccessHandler();
        handler.setUseReferer(true);
        return handler;
    }

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.02.05

안녕하세요, 인프런 AI 인턴입니다. wii021004님의 질문에 답변 드리겠습니다.

스프링 시큐리티에서 로그인 성공 후 이전 페이지로 리다이렉트하려면 SimpleUrlAuthenticationSuccessHandler 클래스의 useReferer 속성을 true로 설정하는 것은 올바른 접근입니다. 이렇게 설정하면 로그인 성공 시 HTTP 헤더의 Referer 값을 사용하여 이전 페이지로 사용자를 리다이렉션할 수 있습니다.

다만, 위에서 제시해주신 코드에는 .defaultSuccessUrl("/")라는 설정이 successHandler()와 함께 사용되고 있습니다. defaultSuccessUrl 메소드는 로그인 성공 후 이동할 기본 URL을 지정하는 역할을 하고, successHandler는 로그인 성공 시 실행할 핸들러를 지정하는 역할을 합니다. useReferer를 사용하기 위해서는 기본 성공 URL을 지정하지 않고 AuthenticationSuccessHandler만 사용하여 로그인 성공 후 처리를 핸들러에 맡겨야 합니다.

defaultSuccessUrl() 설정을 제거하고 successHandler() 설정만 남겨두어 다음과 같이 수정하세요.

@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
            .csrf(csrf -> csrf.disable());

    http.formLogin(formLogin -> formLogin
            .loginPage("/login")
            .usernameParameter("username")
            .passwordParameter("password")
            .loginProcessingUrl("/login_process")
            .successHandler(successHandler()) // 여기에서 defaultSuccessUrl() 설정을 제거합니다.
            .permitAll());

    http.logout(logout -> logout
            .logoutUrl("/logout")
            .permitAll()
            .logoutSuccessUrl("/")); // 로그아웃 성공 후 이동할 URL을 지정합니다.

    return http.build();
}

@Bean
public AuthenticationSuccessHandler successHandler() {
    SimpleUrlAuthenticationSuccessHandler handler = new SimpleUrlAuthenticationSuccessHandler();
    handler.setUseReferer(true); // 리퍼러 사용 설정
    return handler;
}

위와 같이 successHandler() 사용 시 defaultSuccessUrl()을 제거해야 useReferer 설정이 올바르게 적용됩니다. 설정 후에도 문제가 해결되지 않으면, 현재 사용자가 로그인 페이지로 가기 전의 페이지 URL이 Referer HTTP 헤더에 올바르게 있는지 확인해 봐야 합니다. Web 브라우저의 개발자 도구(Network 탭)를 사용하여 HTTP 요청 헤더를 확인할 수 있습니다.

wii021004님의 프로필

wii021004

질문자

2024.02.08

안녕하세요, 답변 감사합니다. 말씀해주신대로 코드를 수정했고, 또 컨트롤러에서 system.out.println을 통해 Referer에 올바르게 로그인 페이지 전의 URL이 들어있다는 걸 확인했습니다만 로그인에 성공해도 로그인 페이지가 갱신될 뿐 이전 페이지로 돌아가지 않습니다. 이 경우 어떻게 해결해야 하나요?