// 순서 -> attemptAuthentication 에서 인증이 정상적으로 실행되고 successfulAuthentication 메서드 실행
// JWT 토큰을 만들어서 request 요청한 사용자에게 토큰을 응답과함께 전달
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
System.out.println("사용자 인증이 완료되어 successfulAuthentication 메서드가 실행됩니다.");
PrincipalDetails principalDetails = (PrincipalDetails)authResult.getPrincipal();
// 빌드패턴으로 토큰 생성하기
String jwtToken = JWT.create()
.withSubject(principalDetails.getUsername()+"님의 토큰")
.withExpiresAt(new Date(System.currentTimeMillis()+(6000*10))) // 토큰의 유효시간 10분으로 지정
.withClaim("id", principalDetails.getUser().getId())
.withClaim("username", principalDetails.getUser().getUserName())
.sign(Algorithm.HMAC512("server-secret")); // server만 알고있는 secret값 으로 서명
response.addHeader("Authentication","Bearer "+jwtToken); // 사용자에게 응답
System.out.println("==================토큰 생성==================");
System.out.println("name : Authentication");
System.out.println("value: Bearer "+ jwtToken);
}
사용자 인증이 성공적으로 완료된 후 실행되는 successfulAuthentication 메서드입니다.
이 메서드의 주요 목적은 인증된 사용자에게 JWT 토큰을 생성하고 응답과 함께 전달하는 것입니다. 코드 설명은 다음과 같이 진행할 수 있습니다.
successfulAuthentication 메서드는 인증이 성공한 후 호출됩니다.
인증 결과(authResult)에서 PrincipalDetails 객체를 가져옵니다. 이 객체는 인증된 사용자의 정보를 포함하고 있습니다.
JWT 토큰을 생성하기 위해 JWT.create()를 호출하고, 이어서 다음 작업을 수행합니다:
json 방식으로 로그인 요청을 했을 때
정상적으로 사용자 인증이되면 successfulAuthentication 메서드에서 토큰을 만들어 응답 헤더에 토큰값을 넣어줍니다.
Authentication 의 value값으로 토큰이 잘 들어간 것을 확인할 수 있습니다.