스프링 시큐리티 - 시큐리티 설정, 인가

하쮸·2024년 12월 29일
0

1. 인가(Authorization)

  • 인가(Authorization)는 애플리케이션에서 사용자가 특정 리소스나 기능에 접근할 수 있는 권한이 있는지 판단하는 과정.
@Controller     // view 반환.
public class IndexController {
    @GetMapping({"", "/"})
    public String index() {
        return "index";     // src/main/resources/templates/index.mustache
    }

    @GetMapping("/user")
    @ResponseBody
    public String user() {
        return "user";
    }

    @GetMapping("/admin")
    @ResponseBody
    public String admin() {
        return "admin";
    }

    @GetMapping("/manager")
    @ResponseBody
    public String manager() {
        return "manager";
    }

    @GetMapping("/login")           // 시큐리티가 해당 URL은 낚아채버림.  -> SecurityConfig 파일 생성 후 작동 안 함.
    @ResponseBody
    public String login() {
        return "login";
    }

    @GetMapping("/join")
    @ResponseBody
    public String join() {
        return "join";
    }

    @GetMapping("/joinProc")
    @ResponseBody
    public  String joinProc() {
        return "회원가입이 완료되었음.";
    }
}
  • 현재는 모든 URL에 대해 정상적으로 접속 가능함.

2. SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable();
        httpSecurity.authorizeRequests()
                .antMatchers("/user/**").authenticated()    
                .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")   
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")                                   
                .anyRequest().permitAll()      
                //.and().formLogin().loginPage("/login");                       
    }
}
  • @Configuration
    • 스프링 설정 클래스임 나타냄. (빈 등록 및 설정)
  • @EnableWebSecurity
    • 시큐리티 활성화 및 보안 설정. (활성화 시) -> 스프링 시큐리티 필터(SecurityConfig)가 스프링 필터체인에 등록됨.
  • .antMatchers("/user/**").authenticated()
    • 해당 주소는 로그인이 필요.
  • .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
    • 해당 주소로 접속 시 로그인뿐만 아니라 권한(admin, manager)도 필요함.
  • .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
    • 해당 주소는 admin 권한만 들어갈 수 있음.
  • .anyRequest().permitAll()
    • 그외 다른 요청은 전부 허용.
  • 위의 URL은 정상적으로 접속이 되지만 아래 URL은 403에러가 발생함.
    • 403 에러(403 Forbidden)는 HTTP 상태 응답 코드로 서버에 요청이 전달되었지만 권한 때문에 거절되었다는 것을 의미.
.and().formLogin().loginPage("/login");
  • 위의 코드에서 제일 하단에 있는 코드에 주석을 풀면
    권한이 없는 URL에 요청할 시 자동으로 /login페이지로 이동시킴.
profile
Every cloud has a silver lining.

0개의 댓글