Spring Boot

[Spring Security] 로그인 성공 시 Handler 설정하기

ZIAHO 2025. 2. 2. 21:59

지난 포스팅에서 로그인에 실패했을 때의 Handler를 설정 해 보았습니다.

그렇다면 로그인에 성공했을때의 상황에 대해서도 설정을 해봐야겠죠?

해보겠습니다.


0. 로그인 성공 이후 실행 될 내용

 

1️⃣ DB상의 패스워드 오류 횟수(pwErrCnt) 0으로 초기화

2️⃣ DB상의 마지막 로그인 일자(last_lgn_at) 업데이트

3️⃣ main 화면으로 이동

 

 

1. 로그인 성공 핸들러 생성 - LoginSuccessHandler.java

 

AuthenticationSuccessHandler를 구현한 핸들러를 생성해줍니다.

핸들러 이름은 LoginSuccessHandler로 정했고 역시나 작명은 자기 자유입니다.

@RequiredArgsConstructor
@Component
public class LoginSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

	private final MemberRepository memberRepository;

	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication) throws IOException, ServletException {

		Member loginMember = memberRepository.findByMemberId(authentication.getName());
		loginMember.updatePwErrCnt(0); // 패스워드 입력 오류 횟수 초기화
		loginMember.updateLastLgnAt(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())); // 최종 로그인 일자 업데이트
		memberRepository.save(loginMember);

		/**
		 * session에 사용자 정보 저장
		 * front에서 ${session.[attributeName]} 으로 사용 가능
 		 */
		HttpSession session = request.getSession();
		session.setAttribute("loginId", authentication.getName());
		session.setAttribute("loginMemberInfo", loginMember);

		setDefaultTargetUrl("/main/mainView");

		super.onAuthenticationSuccess(request, response, authentication);
	}

}

 

1️⃣ SimpleUrlAuthenticationSuccessHandler를 extends.

2️⃣ onAuthenticationSuccess() 메소드를 오버라이드.

3️⃣ Authentication 파라미터는 인증된 사용자 정보를 담고있는 객체.

Authentication 메소드 설명
String getName() 사용자 ID 반환
Collection<> getAuthorities() 사용자 권한 리스트 반환
Object getPrincipal() UserDetails 객체 반환
Object getDetails() IP, 세션 ID를 가진 WebAuthenticationDetails 객체 반환

4️⃣ 패스워드 입력 오류 횟수 초기화 및 최종 로그인시간 업데이트

5️⃣ session에 로그인한 사용자 정보를 담음

6️⃣ main 화면으로 이동

 

* session에 추가한 loginMemberInfo는 html에서 ${session.loginMemberInfo.get**()} 를 적용하여 사용할 수 있습니다.

예시)

<span th:text="'Logged in as: ' + ${session.loginMemberInfo.getLastLgnAt()}"></span>
<span th:text="'사용자명: ' + ${session.loginMemberInfo.getMemberId()}"></span>

 

 

2. 설정 수정 - SecurityConfig.java

 

실패 핸들러를 설정한것과 동일하게 성공 핸들러를 config 파일에 적용시켜줍니다.

defaultSuccessUrl는 사용하지 않게되므로 제거하셔도 됩니다.

// 로그인 실패 Handler
private final LoginFailHandler loginFailHandler;
// 로그인 성공 Handler
private final LoginSuccessHandler loginSuccessHandler;


@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

    http
        .formLogin(login -> login
                .loginPage("/member/loginSignUpView") // 로그인 default 페이지
                .loginProcessingUrl("/member/login")
                .usernameParameter("login_id")
                .passwordParameter("login_password")
                .successHandler(loginSuccessHandler)	// 로그인 성공시 실행 Handler
                .failureHandler(loginFailHandler)	// 로그인 실패시 실행
                .permitAll()
        );
        
}

 

 

3. 결과

pwErrCnt 값이 0으로 초기화되고 lastLgnAt가 업데이트

 

main 화면에서 최종 로그인일자와 사용자 id값이 노출됩니다.

 


출처 및 참고

https://velog.io/@bey1548/Spring-Security-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%84%B1%EA%B3%B5-%EB%8C%80%EC%9D%91-%EB%A1%9C%EC%A7%81

 

Spring Security 로그인 성공 대응 로직

로그인 직후 어떤 페이지로 보내줄 것인지를 결정하거나 방문자 수를 카운트하는 등의 로직을 작성할 수 있습니다.로그인 인증 성공 후 로직을 전개하는 디폴트 클래스는 아래 인터페이스를 상

velog.io