이 글은 정수원님의 Infrean 강의를 학습한 내용을 정리하여 작성합니다.
인가 API - 권한설정과 표현식
인가 API - 권한 설정
선언적 방식
- URL
- http.antMatchers("/users/**).hasRole("USER")
- Method
- @PreAuthorize("hasRole('USER')")
public void user() {System.out.println("user")}
- @PreAuthorize("hasRole('USER')")
동적 방식 - DB 연동 프로그래밍
- URL
- Method
- 이번 글에서는 선언적 방식 중 URL 방식에 대해 학습한다.
- http.antMatcher("/shop/**")
- 과 같이 특정한 경로를 입력하면 사용자가 해당 경로를 요청하는 경우에만 설정 클래스의 보안 기능이 동작할 것이다.
- 만약 설정된 경로가 아닌 다른 경로로 사용자가 접근하는 경우 보안 기능은 동작하지 않는다.
- 만약 경로를 설정하지 않으면 모든 요청에 대해 보안 검사를 수행한다.
- 특정 자원 경로에서만 동작한다.
- .antMatchers("/shop/login", "/shop/users/**").permitAll()
- 해당 하위 경로로 접근하는 모든 요청에 허용한다. (인가 설정)
- .antMatchers("/shop/mypage").hasRole("USER")
- "/shop/mypage" 경로의 경우 USER 권한을 가진 사용자만 접근 가능하다. (인가 설정)
- .access()
- access() 표현식을 사용해 권한 설정을 할 수 있도록 기능을 제공한다.
- .anyReqeust().authenticated()
- 나머지 모든 경로는 인증 받은 사용자만이 접근 가능하다.
- 위에 작성한 모든 조건을 통과해야 실제 자원에 접근 가능할 것이다.
인가 API - 표현식
- fullyAuthenticated()
- rememberMe 인증 방식을 제외한 Form 인증 방식을 통해 인증받은 사용자 접근 가능
- anonymous()
- 익명 사용자는 Role-Anonymous 권한을 부여받는다.
- 인증을 받은 사용자는 Role-User 권한이 부여된다.
- Role-User 권한을 가진 사용자는 anonymous()로 지정된 자원에 접근 불가하다.
- Role-Anonymous, Role-User 사용자가 둘 다 접근하고자 하는 경우 permitAll()을 사용해야 한다.
- hasRole(String) vs. hasAuthority(String)
- hasRole()의 경우 Role USER에서 Role을 제외하고 작성해야 한다.
- hasAuthority()의 경우 Role User과 같이 Role prefix를 함께 작성해야 한다.
실습 - 사용자 생성
- 메모리 방식으로 사용자를 생성한다.
- 생성하는 사용자의 수는 제한이 없다.
- password()를 작성하는 경우 앞에 {noop}과 같은 prefix가 붙는다.
- 패스워드를 검증할 때 필요하다.
- 사용자 생성이 완료되었다면 다음과 같이 각 자원에 인가 처리를 수행한다.
주의!
설정 시 구체적인 경로가 먼저 오고 그것 보다 큰 범위의 경로가 뒤에 오도록 해야 한다.
주의!
위 코드에서 authroizeHttpRequests() 메서드를 사용하면 컴파일 에러가 발생한다.
그러니 authorizeHttpReqeusts() 메서드가 아닌 authorizeRequests() 메서드로 변경해 작성한다.
- controller를 생성한다.
@RestController
public class SecurityController {
@GetMapping("/")
public String index() {
return "home";
}
...
@GetMapping("/user")
public String user() {
return "user";
}
@GetMapping("/admin/pay")
public String adminPay() {
return "adminPay";
}
@GetMapping("/admin/**")
public String admin() {
return "admin";
}
}
실행
/user
- 생성한 사용자 이름과 비밀번호를 통해 접근 가능하다.
- user 계정은 USER 권한을 가지고 있으므로 정상적으로 접근 가능하다.
- USER 권한을 가진 계정으로 /admin 경로 접근 시 다음과 같이 에러 페이지가 출력된다.
/admin/pay
- 로그아웃 수행 후 sys 계정을 통해 접근하도록 한다.
- sys 계정의 경우 다음과 같이 /admin 경로는 접근 가능하지만 /admin/pay 경로는 접근 불가능 할 것이다.
- 물론 /user 경로도 접근 불가할 것이다.
- 여기서 SYS 권한은 USER 권한을 포함하지 않는다.
- 만약 sys 사용자가 /user 자원에 접근 가능하려면 SYS, USER 권한 둘 모두를 부여해야 한다.
'스프링 시큐리티 > 스프링 시큐리티 기본 API 및 Filter 이해' 카테고리의 다른 글
사이트 간 요청 위조 - CSRF, CsrfFilter (0) | 2023.01.28 |
---|---|
예외 처리 및 요청 캐시 필터: ExceptionTranslationFilter, RequestCacheAwareFilter (0) | 2023.01.27 |
세션 제어 필터: SessionManagementFilter, ConcurrentSessionFilter (0) | 2023.01.11 |
동시 세션 제어, 세션 고정 보호, 세션 정책 (0) | 2023.01.11 |
익명 사용자 인증 필터: AnonymousAuthenticationFilter (0) | 2023.01.11 |