개발공부/spring security & JWT 강의

[2강] spring security 설정 (예제)

기억지기 개발자 2023. 9. 15. 13:52
@Configuration // IoC 빈(bean)을 등록
@EnableWebSecurity // 필터 체인 관리 시작 어노테이션
public class SecurityConfig extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/user/**").authenticated()
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")
                //.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN') and hasRole('ROLE_USER')")
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .loginProcessingUrl("/loginProc")
                .defaultSuccessUrl("/");
    }
}

해당 코드는 spring security를 사용하여 웹의 보안 구성을 정의하는 메소드인 configure(HttpSecurity http) 를 재정의 하는 예제이다. 이 메소드는 spring Security의 'HttpSecurity' 객체를 통해 웹 보안 설정을 구성한다.

 

http.csrf().disable();

  • 이 라인은 CSRF 공격 방지를 비활성화하는 설정이다.
  • 이 설정을 통해 CSRF 토큰을 사용하지 않고 요청을 처리할 수 있으며 주의할 점은 보안이 약해질 수 있다. 
    (아마 공부용 예제이니 편의를 위해 비활성화한 것이 아닐까 싶다.)

http.authorizeRequests()

  • 해당 메소드는 요청에 대한 접근 권한을 구현하는데 사용된다. 
    이 메소드를 호출한 뒤에 여러 개의 antMetchers() 메소드 호출로 웹 경로별로 접근 권한을 설정할 수 있다.

.antMatchers("/user/**").authenticated()

  • "/user" 경로에 대한 요청은 인증된(로그인한) 사용자에게만 허용된다.
    다시 말해, "/user" 경로에 접근하려면 로그인을 해야한다.

.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')")

  • "/admin" 경로에 대한 요청은 "ROLE_ADMIN" 역할을 가진 사용자나 "ROLE_USER" 역할 증 하나를 가진 사용자에게 접근을 허용한다.

.anyRequest().permitAll():

  • 이 규칙은 나머지 모든 요청에 대해 접근을 허용한다.
    즉, "/user"와 "/admin" 를 제외한 모든 요청에 대해 접근이 허용된다.

.and()

  • 여러 개의 보안 설정을 연결하는 데 사용된다.

.loginPage("/login")
.loginProcessingUrl("/loginProc")
.defaultSuccessUrl("/");

  • 폼 기반 로그인을 구성한다.
  • .loginPage("/login") : 로그인 페이지의 URL을 지정한다.
  • .loginProcessingUrl("/loginProc") : 로그인을 처리할 URL을 지정한다.
  • .defaultSuccessUrl("/"); : 로그인 성공 시 리다이렉트할 기본 URL을 지정한다.

<< 실행 시켜보기 >>

실제 화면

403 에러는 권한 부족 에러이다.  "/admin" 으로 요청했을 때 성공적으로 오류를 발생시켰으니 성공~

 

요청을 보면 "/login" 으로 되어있지만 "/admin"으로 요청했을 때의 화면이다.