HttpSecurity.authorizeRequests()
메소드로 설정된 URL 패턴은 선언된 순서로 고려됩니다.
이것은 더 세부적으로 구성된 설정 앞에 덜 세부적으로 구성된 설정을 선언하는 실수를 하기 쉽게 합니다.
그러므로, “antMatcher” 선언의 순서를 확인할 필요가 있습니다.
“/**” 이 선언된 경우, 이 설정은 마지막에 선언되어야 합니다.
이 규칙은 다음과 같은 상황에서 문제를 제기합니다.
- 패턴 앞에 **로 끝나는 패턴이 있고 시작이 동일한 경우
- 예 : “/page-admin/db/**“가 “/page-admin/*” 뒤에 있는 경우
- 와일드카드 문자가 없는 패턴 앞에 일치하는 다른 패턴이 나옵니다.
- 예 : “/page-index/db”가 “/page/” 뒤에 있는 경우
규칙을 어긴 코드
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/resources/**", "/signup", "/about").permitAll() // 규칙을 준수한 코드
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/admin/login").permitAll() // 규칙을 어긴 코드; 패턴 "/admin/login" 은 패턴 "/admin/**" 앞에 위치해야 합니다.
.antMatchers("/**", "/home").permitAll()
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") // 규칙을 어긴 코드; 패턴 "/db/**" 패턴 "/**" 앞에 위치해야 합니다.
.and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();
}
규칙을 준수한 해결책
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/resources/**", "/signup", "/about").permitAll() // 규칙을 준수한 코드
.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN") // 규칙을 준수한 코드
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.antMatchers("/**", "/home").permitAll() // 규칙을 준수한 코드; "/**" 이 마지막 입니다.
.and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();
}
참고
- OWASP Top 10 2021 Category A1 - Broken Access Control
- OWASP Top 10 2017 Category A6 - Security Misconfiguration
If you like SONARKUBE, don’t forget to give me a star.