복붙노트

[SPRING] 스프링 보안 : API 용 JWT 토큰 및 웹용 세션

SPRING

스프링 보안 : API 용 JWT 토큰 및 웹용 세션

내 스프링 부트 앱에서 두 보안을 모두 사용하려고합니다. 이미 JWT로 API 측을 수행했지만 웹 측 세션을 구현하는 방법을 모르겠습니다. 이미 다른 프로젝트에서이 작업을 수행했지만 함께 작동시키는 방법을 모르겠습니다.

다음은 내 SecurityConfig입니다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().ignoringAntMatchers("/api/**")
         .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
         .and()
            .authorizeRequests()
            .antMatchers("/api/register").permitAll()
            .antMatchers("/api/login").permitAll()
            .antMatchers("/api/public").permitAll()
            .antMatchers("/api/lost").permitAll()
            .antMatchers("/").permitAll()
            .antMatchers("/login").permitAll()
            .antMatchers("/contact").permitAll()
            .antMatchers("/resources/**").permitAll()
            .antMatchers("/file/**").permitAll()
            .anyRequest().authenticated()
         .and()
            .apply(new JWTConfigurer(this.tokenProvider));
}

나는 이것을 좋아한다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
         // For API side something like : .match("/api/**")
         // No CSRF
         .csrf().ignoringAntMatchers("/api/**")
         // STATELESS session
         // Use token filter
         .apply(new JWTConfigurer(this.tokenProvider));

         // For WEB side something like : .match "others"
         // Use CSRF
         .csrf()
         // Use session

         // And the other permit :
            .authorizeRequests()
            .antMatchers("/api/register").permitAll()
            .antMatchers("/api/login").permitAll()
            .antMatchers("/api/public").permitAll()
            .antMatchers("/api/lost").permitAll()
            .antMatchers("/").permitAll()
            .antMatchers("/login").permitAll()
            .antMatchers("/contact").permitAll()
            .antMatchers("/resources/**").permitAll()
            .antMatchers("/file/**").permitAll()
            .anyRequest().authenticated();
}

아무도 그렇게하는 법을 말해 줄 수 있습니까? (그리고 어떻게 작동하는지 설명해주십시오). 내가 묻는 것에 대해 좋은 해결책을 찾지 못했습니다.

해결법

  1. ==============================

    1.6 시간 동안 검색 한 후 해결책이 있습니다. https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#multiple-httpsecurity

    6 시간 동안 검색 한 후 해결책이 있습니다. https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#multiple-httpsecurity

    편집하다 : 여기 내가 어떻게 그랬 :

    @EnableWebSecurity
    public class MultiHttpSecurityConfig {
    
        @Autowired
        private UserDetailsService userDetailsService;
    
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder(12);
        }
    
        @Configuration
        @Order(1)
        public class ApiSecurityAdapter extends WebSecurityConfigurerAdapter {
    
            private TokenProvider tokenProvider;
    
            public ApiSecurityAdapter(TokenProvider tokenProvider) {
                this.tokenProvider = tokenProvider;
            }
    
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.antMatcher("/api/**") //<= Security only available for /api/**
                    .authorizeRequests()
                        .antMatchers("/api/register").permitAll()
                        .antMatchers("/api/login").permitAll()
                        .antMatchers("/api/public").permitAll()
                        .antMatchers("/api/lost").permitAll()
                        .anyRequest().authenticated()
                    .and()
                        .apply(new JWTConfigurer(this.tokenProvider))
                    .and()
                        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
            }
        }
    
        @Configuration
        public class WebSecurityAdapter extends WebSecurityConfigurerAdapter {
    
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http // <= Security available for others (not /api/)
                    .authorizeRequests()
                        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                        .antMatchers("/").permitAll()
                        .antMatchers("/login").permitAll()
                        .antMatchers("/resources/**").permitAll()
                        .anyRequest().authenticated()
                    .and()
                        .formLogin()
                            .loginPage("/login")
                                .usernameParameter("email")
                                .passwordParameter("password")
                                .defaultSuccessUrl("/central", false)
                                .failureForwardUrl("/login/fail")
                    .and()
                        .logout()
                            .invalidateHttpSession(true)
                            .logoutUrl("/logout")
                            .logoutSuccessUrl("/")
                    .and()
                        .csrf();
            }
        }
    }
    

    희망이 도움이 될 수 있습니다!

  2. from https://stackoverflow.com/questions/44970848/spring-security-jwt-token-for-api-and-session-for-web by cc-by-sa and MIT license