jwt 의존성을 추가해준다.
implementation 'io.jsonwebtoken:jjwt:0.9.1'
스프링 시큐리티에서 관리하는 UserDetails 타입의 객체를 생성해야한다.
public class UserDetailsImpl implements UserDetails {
private final User user;
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getNickname();
}
}
public interface UserRepository extends JpaRepository<User, Long> {
Optional findByEmail(String email);
}
스프링시큐리티에서 유저를 찾는 메소드를 제공하는 UserDetailsService를 추가한다.
UserDetailsService의 loadUserByUsername메소드를 오버라이딩 하여 유저를 찾는 방법을 직접 지정한다.
반환타입은 UserDetails타입이어야한다.
public class CustomUserDetailService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return userRepository.findByEmail(username)
.orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다."));
}
}
JWT을 생성, 검증, 정보추출 해주는 클래스이다.
JWT필터 안에서만 사용할 수 있으면 된다.
인증에 성공하면 authentication객체를 Context안에 넣는다.
인증에 실패하면 아무런 과정 없이 다음 필터로 넘어간다.
JWT필터를 스프링 시큐리티가 관리하려면 설정에서 추가해줘야한다.
필터는 new를 사용해서 객체를 생성하여 등록해주어야 한다.
필터에 @Component나 @Bean을 붙이게 되면 new로 선언해준것 외에도 한번 더 필터로 등록되기 때문이다.
쿠키에 있는 토큰을 전달할 것이기 때문에 CORS설정 또한 해주어야한다.
스프링 시큐리티에서 스프링의 CORS설정을 가져다 사용할 수 있도록 설정해준다.
클라이언트의 쿠키를 전달하고 받을 것이기 때문에 allowCredentials를 true로 설정한다.
클라이언트의 쿠키에 전달한 헤더를 exposedHeader안에 넣어주어야 한다.