Spring Security에서 hasAuthority와 그 외의 다양한 표현식들은 권한 기반의 액세스 제어를 위한 유용한 도구입니다. 이 표현식들은 애플리케이션의 보안을 강화하며 사용자가 특정 리소스에 접근할 수 있는지 여부를 결정하는 데 중요한 역할을 합니다.
1. hasAuthority
hasAuthority는 사용자가 특정한 단일 권한을 가지고 있는지 여부를 확인하는 표현식입니다. 이는 사용자가 필요한 권한을 소유하고 있을 때만 접근을 허용하는 데 유용합니다.
예시:
http
.authorizeRequests()
.antMatchers("/admin").access("hasAuthority('ROLE_ADMIN')")
.anyRequest().authenticated();
위의 예시에서 /admin 경로는 ROLE_ADMIN 권한을 가진 사용자만 접근할 수 있도록 설정되어 있습니다.
2. hasAnyAuthority
hasAnyAuthority는 사용자가 지정된 권한 중 하나라도 가지고 있으면 접근을 허용합니다. 여러 권한을 확인할 때 유용하며, 하나라도 만족하면 됩니다.
예시:
http
.authorizeRequests()
.antMatchers("/management").access("hasAnyAuthority('ROLE_ADMIN', 'ROLE_MANAGER')")
.anyRequest().authenticated();
위의 코드에서는 ROLE_ADMIN 또는 ROLE_MANAGER 권한을 가진 사용자만 /management 경로에 접근할 수 있습니다.
3. hasRole와 hasAnyRole
hasRole과 hasAnyRole은 권한이 아닌 역할을 확인합니다. Spring Security에서는 일반적으로 역할은 ROLE_ 접두사로 구분되며, hasRole은 ROLE_ 접두사가 자동으로 추가된다고 보면 됩니다.
• **hasRole('ADMIN')**은 ROLE_ADMIN 역할을 의미합니다.
• **hasAnyRole('ADMIN', 'MANAGER')**는 둘 중 하나라도 역할을 가지고 있으면 접근할 수 있습니다.
예시:
http
.authorizeRequests()
.antMatchers("/user/**").access("hasRole('USER')")
.antMatchers("/admin/**").access("hasAnyRole('ADMIN', 'MANAGER')")
.anyRequest().authenticated();
4. permitAll와 denyAll
• permitAll: 모든 사용자가 접근할 수 있게 허용합니다.
• denyAll: 모든 사용자의 접근을 차단합니다.
예시:
http
.authorizeRequests()
.antMatchers("/public").permitAll()
.antMatchers("/private").denyAll()
.anyRequest().authenticated();
위 코드에서 /public 경로는 모두에게 허용되지만, /private 경로는 모두에게 차단됩니다.
5. isAuthenticated와 isAnonymous
• isAuthenticated: 인증된 사용자만 접근 가능.
• isAnonymous: 인증되지 않은 사용자만 접근 가능.
예시:
http
.authorizeRequests()
.antMatchers("/login").isAnonymous()
.antMatchers("/dashboard").isAuthenticated()
.anyRequest().authenticated();
위에서 /login은 비로그인 상태의 사용자만 접근할 수 있으며, /dashboard는 로그인한 사용자만 접근 가능합니다.
6. isRememberMe, isFullyAuthenticated
• isRememberMe: Remember Me로 인증된 사용자만 접근 가능.
• isFullyAuthenticated: 완전한 인증을 요구합니다. Remember Me 인증된 사용자에겐 접근을 허용하지 않습니다.
예시:
http
.authorizeRequests()
.antMatchers("/remember").access("isRememberMe()")
.antMatchers("/secure").access("isFullyAuthenticated()")
.anyRequest().authenticated();
위에서 /remember는 Remember Me로 로그인된 사용자만 접근 가능하며, /secure는 완전히 인증된 사용자만 접근할 수 있습니다.
이러한 Spring Security 표현식들은 다양한 상황에서 적용될 수 있으며, 애플리케이션 보안 정책에 맞춰 조합하여 사용할 수 있습니다. 예를 들어, 사용자가 인증되지 않은 경우는 로그인 화면으로 리디렉션하는 등의 구성이 가능합니다.
'Spring Security' 카테고리의 다른 글
FilterOrderRegistration 클래스 구조와 역할 (0) | 2024.10.31 |
---|---|
requestMatcher (0) | 2024.10.30 |
CSRF(Cross-Site Request Forgery) (2) | 2024.10.30 |
@Async (0) | 2024.10.29 |
DelegatingSecurityContextCallable (0) | 2024.10.29 |