Spring Security

스프링 시큐리티 자동로그인 Remember-me 안될 때 해결방법

dev.mk 2023. 11. 5. 21:05
반응형

일반적인 스프링시큐리티 자동로그인 설정을 하였지만 여러 문제가 발생

대표적인 문제는 브라우저에 remember-me 쿠키가 생성 안되는 문제다. 

 

1.  시큐리티 설정파일에 SecurityService를 @Autowired로 의존성을 주입시킨다. 

 

SecurityConfig.java

@EnableWebSecurity
public class SecurityConfig {

    //스프링에서 제공하는 UserDetails 서비스의 loadUserByUsername 메소드를 구현한 서비스
    @Autowired
    private SecurityService securityService;
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
    
    .... 생략
    
    // 자동로그인 관리
    .rememberMe( rememberMe -> 
        rememberMe
            .rememberMeParameter("remember-me")		 	//기본 파라미터명은 remember-me
            .rememberMeCookieName("remember-me") 		// 브라우저에 저장된 쿠키 이름을 지정합니다. 
            .key("myAppKey") 							//토큰을 식별하기위한 키를 지정합니다. 
            .tokenValiditySeconds(3600)					//default는 14일
            .userDetailsService(securityService)		//Remember me에서 시스템에 있는 사용자 계정을 조회할때 사용할 클래스 
            .authenticationSuccessHandler(customAuthenticationSuccessHandler())
    )
}

 

 

 

2. UserDetails를 구현한 구현체 UserDetails의 username변수의 getter를 본인이 사용하는 아이디 변수로 지정한다.

//회원 DTO
@Data
@EqualsAndHashCode(of = "memberId")
public class MemberDTO implements UserDetails {

    private static final long serialVersionUID = 1L;
    private Long MemberNo;
    private String memberId;
    private String memberPwd;
...생략

    //이것을 하지 않으면 remember-me 기능을 사용 할 수 없다
    //loadUserByUsername메소드에서 사용하는 vo 변수를 username에 getter로 지정
    @Override
    public String getUsername() {
        return id;
    }

}

 

UserDetails를 구현한 구현체 에서 (MemberDTO.java) username getter를

loadUserByUsername 메소드에 조회 조건으로 사용하는 변수명으로 지정한다.

 

 

이제 어플리케이션 탭에 remember-me 쿠키가 생성됐다!

반응형