JPA 연습을 위해 이런 허접한 ER 다이어그램을 작성하고
SpringBoot 를 사용하여 어플리케이션을 개발하고 있었다.
이왕 하던거 오랜만에 SpringSecurity 를 사용하여 JWT 까지 적용시키려고 했다.
SpringSecurity 6.2 버전 부터는 apply api 를 사용하지 못한다고 한다.
해결 방법은 생각보다 꽤 간단했다.
내가 apply 를 사용하는 이유는 JWT 토큰을 감지하는 필터를 추가하기 위해서 사용하는 것이다.
그래서 추가하려고 한JwtSecurityConfig
클래스는 내가 정의한 필터와 필터의 위치를
지정해주기 위해서 사용한다.JwtSecurityConfig
@RequiredArgsConstructor public class JwtSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> { private final TokenSetting setting; @Override public void configure(HttpSecurity http) { http.addFilterBefore( new JwtFilter(setting), UsernamePasswordAuthenticationFilter.class ); } }
HttpSecurityBuilder 에 addFilterBefore 추가하여 사용
SpringSecurityConfig
@Configuration @EnableWebSecurity @RequiredArgsConstructor public class SpringSecurityConfig { private final TokenSetting setting; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.csrf(AbstractHttpConfigurer::disable) .cors(AbstractHttpConfigurer::disable) .sessionManagement(m -> m.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .formLogin(AbstractHttpConfigurer::disable) .httpBasic(AbstractHttpConfigurer::disable) .addFilterBefore(new JwtFilter(setting), UsernamePasswordAuthenticationFilter.class) .authorizeHttpRequests(auth -> auth.anyRequest().permitAll()); return http.build(); }
.addFilterBefore(new JwtFilter(setting), UsernamePasswordAuthenticationFilter.class)
기존의addFilterBefore
필드를HttpSecurity
빌더에서 사용하여 추가했다.
@Controller
public class TestController {
@GetMapping("/mean")
@ResponseBody
public String test()
{
return "mean";
}
}
@RequiredArgsConstructor
@Slf4j
public class JwtFilter extends OncePerRequestFilter {
private final TokenSetting setting;
private String resolveToken(HttpServletRequest request)
{
String bearerTkn = request.getHeader("Authorization");
if(hasText(bearerTkn) && bearerTkn.startsWith("Bearer ")) return bearerTkn.substring(7);
return null;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String jwt = resolveToken(request);
String uri = request.getRequestURI();
log.info("요청 URL : {}",uri);
if(hasText(jwt))
{
System.out.println("토큰 존재");
}
else
{
System.out.println("토큰 존재 X");
}
filterChain.doFilter(request,response);
}
}
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SpringSecurityConfig
{
private final TokenSetting setting;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable)
.cors(AbstractHttpConfigurer::disable)
.sessionManagement(m -> m.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.formLogin(AbstractHttpConfigurer::disable)
.httpBasic(AbstractHttpConfigurer::disable)
.addFilterBefore(new JwtFilter(setting), UsernamePasswordAuthenticationFilter.class)
.authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
return http.build();
}
정상적으로 필터가 추가된 것을 확인할 수 있다.