인프런 커뮤니티 질문&답변

이경도님의 프로필 이미지

작성한 질문수

스프링부트 시큐리티 & JWT 강의

SpringSecurity JWT 로그인 URL 2개 설정하는 방법

작성

·

188

0

안녕하세요

 

SpringSecurity를 이용해서 유저 , 관리자 로그인의 대한 로직을 따로 두고싶습니다.

SecurityFilter내에서

유저 로그인 URL과 로직을

관리자 로그인 URL과 로직을

어떻게 나눌 수 있을까욤 ㅠㅠ?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

스프링 시큐리티(Spring Security)를 사용하여 다른 권한을 가진 유저와 관리자 로그인의 로직을 나누려면, 별도의 SecurityFilterChain을 정의하여 구분할 수 있습니다. 각각의 로그인 URL과 로직에 맞게 HttpSecurity 객체를 설정하여 처리합니다. 예를 들어, configure(HttpSecurity http) 메소드 내에서 유저와 관리자에 대한 인증 절차를 분리하여 설정할 수 있습니다. 여기에 JWT 토큰 기반 인증을 추가하기 위해서는 JWT 토큰을 검증하고 인증하는 로직을 커스텀 필터로 추가하고, 해당 필터를 HttpSecurity의 필터 체인에 등록해야 합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain userFilterChain(HttpSecurity http) throws Exception {
        http
            .antMatcher("/user/**") // 유저 로그인 URL을 "/user/**"로 설정
            .authorizeRequests()
                .anyRequest().hasRole("USER")
            .and()
            .addFilterBefore(new JwtTokenFilter(), UsernamePasswordAuthenticationFilter.class)
            // JWT 토큰 필터 추가
            // 여기서 JwtTokenFilter는 JWT 토큰을 검증하는 커스텀 필터
            .formLogin()
                .loginProcessingUrl("/user/login"); // 유저 로그인 처리 URL
        
        return http.build();
    }

    @Bean
    public SecurityFilterChain adminFilterChain(HttpSecurity http) throws Exception {
        http
            .antMatcher("/admin/**") // 관리자 로그인 URL을 "/admin/**"로 설정
            .authorizeRequests()
                .anyRequest().hasRole("ADMIN")
            .and()
            .addFilterBefore(new JwtTokenFilter(), UsernamePasswordAuthenticationFilter.class)
            // 여기서 JwtTokenFilter는 JWT 토큰을 검증하는 커스텀 필터
            .formLogin()
                .loginProcessingUrl("/admin/login"); // 관리자 로그인 처리 URL

        return http.build();
    }

}

위 예시에서는 두 개의 SecurityFilterChain을 정의하여 각각 유저와 관리자의 로그인 로직을 구분하였습니다. antMatcher 메소드를 사용하여 각각의 로그인 URL 및 로직을 나누고 있으며, JwtTokenFilter라는 커스텀 필터를 이용하여 JWT 토큰 검증을 수행합니다. JwtTokenFilter의 구현은 여기서 별도로 제공되지 않았지만, 일반적으로 OncePerRequestFilter를 상속받아 구현합니다.

시큐리티 설정을 커스터마이징할 때는 스프링 시큐리티의 기본 웹 보안 설정을 덮어쓰기 때문에 기존의 설정이 필요없을 경우 명시적으로 비활성화해야 할 수도 있습니다. 자세한 정보는 스프링 공식 문서를 참조하세요.

단, 제공된 정보에는 JWT를 직접적으로 언급하는 부분이 없으므로, JWT와 관련된 로직은 스프링 시큐리티의 기본 구조를 이해하고 적용하는 방식으로 진행해야 합니다.