spring security 로그인 성공 커스터마이징
로그인 절차는 아래와 같습니다. QR코드 초점이 잘 안 맞는 경우 스마트폰을 거리를 조절해서 초점을 맞춰 주세요. PC 로그인 QR코드 인증 유효시간은 3분입니다. 3분이 지나면 만료가 되지만 다시 QR코드를 생성해서 스캔하시면 됩니다.
Contents
인증 권한이 필요한 페이지에 접근 했을 때
로그인 화면을 띄우기 전에 필요한 정보들을 세션에 저장하게 됩니다. spring security 에서 제공하는 사용자의 요청을 저장하고 꺼낼 수 있는 RequestCache 인터페이스를 사용해서 사용자 요청 정보들이 들어 있는 SavedRequest 클래스 객체를 세션에 저장합니다. 우리는 RequestCache 객체를 생성해서 SavedRequest 객체를 가져와 로그인 화면을 보기 전에 방문했던 URL 정보를 가져오면 됩니다.
로그인 실패 시 에러 세션 지우기
로그인 하는 과정에서 우리는 3번 실패 시 계정을 비활성화 시키는 근로를 했었다. 만약 2 번 실패 후 3번째에 성공해 로그인을 성공 하는 경우도 있습니다. 로그인에 한번이라도 실패한다면 에러가 세션에 저장되게 됩니다. 로그인이 성공했음으로 에러를 세션에 남겨놔서는 안됩니다. clearAuthenticationAttributesrequest 을 통해 세션을 지우는 메소드를 실행합니다. HttpSession session request.getSessionfalse 을 통해 세션을 받아옵니다.
sessionnull 을 통해 세션에 에러가 없습니다.면 그냥 return 합니다.
LoginSuccessHandler
로그인이 인증된 코드를 들고 Authentication이 Context에 저장되었습니다. 그럼 이제 위에서 말했던 Successhandler 가 실행되어야 합니다.
여기서 Service에서 만든 토큰을 전달하게 되지만 하지만 하지만 accessToken과 RefreshToken을 만들어서 전달합니다. 이때 extractUsername을 통해 인증된 Authentication 객체에서 UserDetails 객체로 옮겨 담아 거기에 있는 내용을 빼낸다.
그래서 그곳의 아이디를 가져와서 아이디를 accessToken에 넣어둔다. 그리고 마지막으로 회원이 탈퇴한 회원인지 심사숙고하는 조건문을 넣게 되고 탈퇴한 회원도 다뤄보고자 했다.
로그인 성공 시, 실패 데스크 초기화
로그인 실패 핸들러에서 로그인 실패 시, 실패 카운터를 증가 시켰다. 하지만 실패 카운터가 증가된 상태로 로그인에 성공하게 되면, 다음 번 로그인을 할 경우 더 적은 실패 기회를 얻게 됩니다. 따라서 로그인 시도할 때 마다. 같은 시도 횟수를 주려고 한다면, 로그인이 성공할 때 실패 카운터를 초기화해야 합니다. DB 근로를 하기 위해서 UserService 를 Autowired 해줍니다. DB 에 저장된 failurecnt 컬럼값이 0 으로 초기화 될 수 있도록 쿼리를 작성합니다.
아이디 비밀번호가 저장된 값과 일치하지 않아서 failurecnt 값이 증가했다. 그리고 로그인에 성공하자 failurepcnt 값이 0 으로 초기화 된 것을 확인할 수 있어요.
커스텀 사용자 정보 정의하기
CustomUserDetail.java Spring Security에서 제공하는 디폴트 사용자 모델인 User를 상속받아, 새로운 커스텀 사용자 모델을 만들었다. CustomUserDetailsService.java 데이터베이스에서 사용자 정보를 가져와서 Spring Security에서 사용할 수 있는 UserDetails 객체로 변환하는 기능을 추가하기 위해 UserDetailsService을 커스텀 클래스로 구현하였습니다.
이를 통해 JWT 인증 필터 등에서 데이터베이스에서 조회한 사용자 정보를 활용가능하게 보인다 public CustomUserDetail loadUserByUsername(String username)
기본적으로 사용자명을 기반으로 사용자 정보가 존재하는지를 심사숙고하는 메서드입니다.
패스워드가 틀린 경우
Swagger 상에서 테스트 해보았을 때, 이메일과 패스워드가 모두 일치했을 때에는 JWT를 정상적으로 응답으로 받는 것을 확인할 수 있어요. 반대로 존재하지 않는 이메일을 입력하거나, 이메일은 존재하지만 패스워드가 틀렸을 경우에는 403 Forbidden이 Http Status로 반환되는 것을 확인하여, JWT 로그인 인증 기능을 테스트 완료하였습니다.
자주 묻는 질문
인증 권한이 필요한 페이지에 접근 했을
로그인 화면을 띄우기 전에 필요한 정보들을 세션에 저장하게 됩니다. 좀 더 구체적인 사항은 본문을 참고하시기 바랍니다.
로그인 실패 시 에러 세션
로그인 하는 과정에서 우리는 3번 실패 시 계정을 비활성화 시키는 근로를 했었다. 궁금한 사항은 본문을 참고하시기 바랍니다.
로그인이 인증된 코드를 들고 Authentication이 Context에 저장되었습니다. 구체적인 내용은 본문을 참고하시기 바랍니다.