์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ํ์ฒ์ ๋ฆฌํธ๋ฆฌํธ
- Java
- JavaScript
- ์นดํ๋๊ฐ
- ์ฝ๋ฉ
- ๋ฐฐ์์ ๋ฐฐ์
- ๋๊ฐ
- database
- ์ค๋ผํด
- ์นํผ๋ธ๋ฆฌ์ฑ
- ์ํ
- ์ํ์ฃผ
- ํ์ด์ฌ
- Python
- ๊ฐ์ดํ ์ข ๋ญ๊ฐ๋น
- ์๋ฐ
- ์ ๋ฆฌํธ๋ฆฌํธ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ค๋ธ์
- K๋ฐฐํฐ๋ฆฌ๋ ๋ณผ๋ฃจ์
- ๋ฐ์ํ
- ๊น๋ฏธ๊ฒฝ์๋งํ์์
- ํ๋ก๊ทธ๋๋ฐ
- html
- ์ฑ
- ๋ ์
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ๊ฐ๋ฐ
- ์๋ฐ์คํฌ๋ฆฝํธ
- css
- Today
- Total
JiYoung Dev ๐ฅ
Spring Security ์ ์ฉ๊ธฐ (6) Spring Security Authorization(HttpServletRequests) ๋ณธ๋ฌธ
Spring Security ์ ์ฉ๊ธฐ (6) Spring Security Authorization(HttpServletRequests)
Shinjio 2024. 5. 5. 19:57Spring Security ์ ์ฉ๊ธฐ (5) Spring Security Authentication ๋์์๋ฆฌ
jwt์ ๋ํด ๊ณต๋ถํ๊ณ ์ธ์ฆ ๋ฐ ์ธ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๋ ์ค spring security์ ๋ํ ์ดํด๊ฐ ์์ง ๋ถ์กฑํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ์ด๋ป๊ฒ spring security๋ ์ธ์ฆ ๋ฐ ์ธ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ , ์ด๋ป๊ฒ ์๋ํ๋๊ฐ์
danyoujeong.tistory.com
์ง๋ ์๊ฐ์ ์ด์ด ์ด๋ฒ์๋ Spring Security์ Authorization ์๋ ์๋ฆฌ์ HttpRequest์ ๋ํ ์ธ๊ฐ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์๋ค.
์ด๋ฒ ํฌ์คํ ์ญ์ ์คํ๋ง ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๋ค.
https://docs.spring.io/spring-security/reference/servlet/authorization/index.html
Authorization :: Spring Security
The advanced authorization capabilities within Spring Security represent one of the most compelling reasons for its popularity. Irrespective of how you choose to authenticate (whether using a Spring Security-provided mechanism and provider or integrating w
docs.spring.io
๊ฐ์
์ฌ์ฉ์์ ์ธ์ฆ ๋ฐฉ๋ฒ์ ์ค์ ํ ํ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ถํ ๋ถ์ฌ ๊ท์น์ ๊ตฌ์ฑํด์ผ ํ๋ค.
์คํ๋ง ์ํ๋ฆฌํฐ๋ ์คํ๋ง ์ํ๋ฆฌํฐ์์ ์ ๊ณตํ๋ ์ธ์ฆ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ์ง ํน์ ๋ค๋ฅธ ์ธ์ฆ ๋ฐฉ๋ฒ๊ณผ ํตํฉํ์ฌ ์ฌ์ฉํ๋ ์ง์๋ ๊ด๊ณ ์์ด, ๊ถํ ๋ถ์ฌ ์๋น์ค๋ฅผ ์ผ๊ด๋๊ณ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์ ์ฌ์ฉํ ์ ์๋ค.
๊ถํ ๊ท์น ๋ถ์ฌ๋ ์์ฒญ URI ๋ฐ ๋ฉ์๋์ ๊ท์น์ ๋ถ์ฌํ๋ ๊ฒ์ด ์ข๋ค. ์๋์ ๋ด์ฉ์์ ์์ฒญ URI์ ๋ํ ๊ถํ ๋ถ์ฌ ์์ ๋ฐฉ์์ ๋ํด ์์ธํ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค.
โ๏ธAuthrization Architecture
Authorities
์ธ์ฆ(Authentication) ๊ณผ์ ์์๋ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช ์ ๊ฒ์ฆํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ก ์ธ์ฆ๋ ์ฌ์ฉ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
์ด ์ธ์ฆ๋ ์ฌ์ฉ์ ๊ฐ์ฒด๋ ์ฌ์ฉ์๊ฐ ๊ฐ์ง๋ ๊ถํ์ ๋ํ๋ด๋ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ค์ "GrantedAuthority"๋ผ ํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ ํน์ ๋ฆฌ์์ค ๋๋ ๊ธฐ๋ฅ์ ๋ํ๋ธ๋ค.
GrantedAuthority๋ AuthenticationManager์ ์ํด Authentication ๊ฐ์ฒด์ ์ฝ์ ๋๋ฉฐ,
๋์ค์ AccessDecisionManager๋ GrantedAuthority๋ค์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ํน์ ๋ฆฌ์์ค๋ ๊ธฐ๋ฅ์ ์์ธ์ค ํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ GrantedAuthority๋ ์ฌ์ฉ์๊ฐ ๊ถํ๋ถ์ฌ ๊ฒฐ์ ์ ๋ด๋ฆด ๋ ํ์์ ์ธ ์ ๋ณด์ด๋ค.
GrantedAuthority ์ธํฐํ์ด์ค๋ ๋จ ํ๋์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
String getAuthority();
ํด๋น ๋ฉ์๋๋ AuthorizationManger ์ธ์คํด์ค๊ฐ GrantedAuthority์ ์ ํํ ๋ฌธ์์ด ํํ์ ์ป๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
๋ง์ฝ, GrantedAuthority๋ฅผ ๋ฌธ์์ด๋ก ์ ํํ ํํ๋ ์ ์๋ ๊ฒฝ์ฐ, GrantedAuthority๋ ๋ณต์ก(complex)ํ๋ค๊ณ ์ฌ๊ฒจ์ง๋ฉฐ getAuthority()๋ null์ ๋ฐํํด์ผ ํ๋ค.
Spring Security๋ GrantedAuthority ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ SimpleGrantedAuthority ๊ตฌํ์ฒด๋ฅผ ํฌํจํ๊ณ ์๋ค. ์ด ๊ตฌํ์ฒด๋ ์ฌ์ฉ์๊ฐ ์ง์ ํ ๋ฌธ์์ด์ GrantedAuthority๋ก ๋ณํํ ์ ์๋ค. ๋ณด์ ์ํคํ ์ฒ์ ํจ๊ป ์ ๊ณต๋๋ ๋ชจ๋ AuthenticationProvider ์ธ์คํด์ค๋ SimpleGrantedAuthority๋ฅผ ์ฌ์ฉํ์ฌ Authentication ๊ฐ์ฒด๋ฅผ ์ฑ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ญํ ๊ธฐ๋ฐ์ ๊ถํ ๋ถ์ฌ ๊ท์น์ ROLE_์ ์ ๋์ด๋ก ์ฌ์ฉํ๋ค.
๋ํ GrantedAuthorityDefaults๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ํ ์ ์๋ค.
@Bean
static GrantedAuthorityDefaults grantedAuthorityDefaults() {
return new GrantedAuthorityDefaults("MYPREFIX_");
}
GrantedAuthorityDefaults๋ฅผ ์ ์ ๋ฉ์๋๋ก ๋ ธ์ถํ์ฌ Spring์ด Spring Security์ ๋ฉ์๋ ๋ณด์ @Configuration ํด๋์ค๋ฅผ ์ด๊ธฐํํ๊ธฐ ์ ์ ํด๋น ๋น์ ๊ฒ์ํ๋๋ก ํ๋ค.
โ๏ธInvocation Handling
Spring Security๋ ๋ฉ์๋ ํธ์ถ์ด๋ ์น ์์ฒญ๊ณผ ๊ฐ์ ๋ณด์ ๊ฐ์ฒด์ ๋ํ ์์ธ์ค๋ฅผ ์ ์ดํ๋ ์ธํฐ์ ํฐ๋ฅผ ์ ๊ณตํ๋ค.
AuthorizationManager ์ธ์คํด์ค๋ ๋ฉ์๋ ํธ์ถ ํน์ ์น ์์ฒญ์ด ์งํ๋ ์ ์๋์ง์ ๋ํ ์ฌ์ ํธ์ถ ๊ฒฐ์ ์ ๋ด๋ฆฐ๋ค.
์ฃผ์ด์ง ๊ฐ์ด ๋ฐํ๋ ์ ์๋์ง์ ๋ํ ์ฌํ ํธ์ถ ๊ฒฐ์ ๋ํ AuthorizationManager์ ์ํด์ ์ด๋ฃจ์ด์ง๋ค.
The AuthorizationManager
AuthorizationManager๋ AccssDecisionManager์ AccessDecisionVoter๋ฅผ ๋์ฒดํ๋ค.
์ฆ ์ด์ ์๋ AccssDecisionManager ๋ฐ AccessDecisionVoter๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ์ค ๊ฒฐ์ ์ ์ํํ์ง๋ง, ์ด์ ๋ AuthorizationManager๋ฅผ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ๋ค.
AuthorizationManager๋ Spring Security์ ์์ฒญ ๊ธฐ๋ฐ, ๋ฉ์๋ ๊ธฐ๋ฐ ๋ฐ ๋ฉ์์ง ๊ธฐ๋ฐ ์ธ๊ฐ ๊ตฌ์ฑ ์์์์ ํธ์ถ๋๋ฉฐ ์ต์ข ์์ธ์ค ์ ์ด ๊ฒฐ์ ์ ๋ด๋นํ๋ค. AuthorizationManager ์ธํฐํ์ด์ค์๋ ๋ ๊ฐ์ ๋ฉ์๋๊ฐ ํฌํจ๋์ด ์๋ค.
//์ธ๊ฐ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ๋ฌ ๋ฐ๋๋ค.
//ํนํ, ๋ณด์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํจ์ผ๋ก์จ ์ค์ ๋ณด์ ๊ฐ์ฒด ํธ์ถ์ ํฌํจ๋ ์ธ์๋ฅผ ๊ฒ์ฌํ ์ ์๋ค.
//์์ธ์ค ํ์ฉ -> ์์์ AuthorizationDecision, ๊ฑฐ๋ถ -> ์์์ AuthorizationDecision
//๊ฒฐ์ ์ ๋ด๋ฆฌ์ง ์๋ ๊ฒฝ์ฐ null AuthorizationDecision ๋ฐํ
AuthorizationDecision check(Supplier<Authentication> authentication, Object secureObject);
//check๋ฅผ ํธ์ถํ๊ณ AuthorizaitonDecision์ด ์์์ธ ๊ฒฝ์ฐ AccessDeniedException์ throw
default AuthorizationDecision verify(Supplier<Authentication> authentication, Object secureObject)
throws AccessDeniedException {
// ...
}
Delegate ๊ธฐ๋ฐ์ AuthorizationManager ๊ตฌํ
์ฌ์ฉ์๋ค์ ์ธ๊ฐ(authorization)์ ๋ชจ๋ ์ธก๋ฉด์ ์ ์ดํ๊ธฐ ์ํด ์ง์ AuthorizationManager๋ฅผ ๊ตฌํํ ์ ์์ง๋ง,
Spring Security๋ ๊ฐ๋ณ AuthorizationManager์ ํ๋ ฅํ ์ ์๋ ์์(delegate) ํ์์ AuthorizationManager๋ฅผ ์ ๊ณตํ๋ค.
์์ฒญ์ ๋ํ ์ธ๊ฐ๋ฅผ ์ํด์๋ RequestMatcherDelegatingAuthorizationManager,
๋ฉ์๋ ๋ณด์์ ๊ฒฝ์ฐ AuthorizationMangerBeforeMethodInterceptor์ AuthorizationManagerAfterMethodInterceptor๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Hierarchical Roles
์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์์ ํน์ ์ญํ ์ด ๋ค๋ฅธ ์ญํ ์ ์๋์ผ๋ก ํฌํจํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ผ๋ฐ์ ์ด๋ค.
์๋ฅผ๋ค์ด ๊ด๋ฆฌ์์ ์ฌ์ฉ์ ์ญํ ์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ด๋ฆฌ์๋ ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ํ ์ ์๋ ์์ ์ ๋ชจ๋ ์ํํ ์ ์๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ์ญํ ๊ณ์ธต์ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ญํ ํน์ ๊ถํ์ด ๋ค๋ฅธ ์ญํ ์ ํฌํจํด์ผ ํ๋์ง๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
Spring Security์ RoleVoter์ ํ์ฅ๋ ๋ฒ์ ์ธ RoleHierarchyVoter RoleHierarchy๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ฌ์ฉ์์๊ฒ ํ ๋น๋ ๋ชจ๋ ๋๋ฌ ๊ฐ๋ฅํ ๊ถํ์ ์ป๋๋ค.
์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ์ ์๋์ ๊ฐ๋ค.
@Bean
static RoleHierarchy roleHierarchy() {
RoleHierarchyImpl hierarchy = new RoleHierarchyImpl();
hierarchy.setHierarchy("ROLE_ADMIN > ROLE_STAFF\n" +
"ROLE_STAFF > ROLE_USER\n" +
"ROLE_USER > ROLE_GUEST");
return hierarchy;
}
// and, if using method security also add
@Bean
static MethodSecurityExpressionHandler methodSecurityExpressionHandler(RoleHierarchy roleHierarchy) {
DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy);
return expressionHandler;
}
์์ ์ฝ๋์์๋ 4๊ฐ์ง ์ญํ (ADMIN, STAFF, USER, GUEST)์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ">" ๊ธฐํธ๋ ํฌํจ์ ์๋ฏธํ๋ค.
์ญํ ๊ณ์ธต์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผ ์ ์ด ๊ตฌ์ฑ ๋ฐ์ดํฐ๋ฅผ ๊ฐํธํ๊ฒ ๋จ์ํํ๊ฑฐ๋, ์ฌ์ฉ์์๊ฒ ํ ๋นํด์ผ ํ๋ ๊ถํ ์๋ฅผ ์ค์ด๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ๋ ๋ณต์กํ ์๊ตฌ์ฌํญ์ ๊ฒฝ์ฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์๋ก ํ๋ ํน์ ์ก์ธ์ค ๊ตฌ๋ํ๊ณผ ์ฌ์ฉ์์๊ฒ ํ ๋น๋ ์ญํ ๊ฐ์ ๋ ผ๋ฆฌ์ ๋งคํ์ ์ ์ํ์ฌ, ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ก๋ํ ๋ ์ด ๋ ์ฌ์ด๋ฅผ ๋ณํํ ์ ์๋ค.
๋จ RoleHierarchy ๋น ๊ตฌ์ฑ์ ์์ง @EnableMethodSecurity๋ก ์ด์ ๋์ง ์์๋ค. ๋ฐ๋ผ์ ์ด ์์ ๋ AccessDecision Voter๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ๋ฉ์๋ ๋ณด์์ RoleHierarchy ์ง์์ด ํ์ํ ๊ฒฝ์ฐ, github.com/spring-projects/spring-security/issues/12783 ์ด์๊ฐ ์๋ฃ๋ ๋๊น์ง @EnableGlobalMethodSecurity๋ฅผ ๊ณ์ ์ฌ์ฉํด์ผ ํ๋ค.
→ ํ์ฌ๋ @EnableMethodSecurity์์ RoleHierarchy๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์.
→ ์ฌ์ฉํ๋ ค๋ฉด Spring Seucirty ์ค์ ํด๋์ค์ @EnableGlobalMethodSecurity ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด ๋ฉ์๋ ๋ณด์์ ํ์ฑํํ ์ ์์
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Bean
public RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
// ์ญํ ๊ณ์ธต ๊ตฌ์ฑ
roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");
return roleHierarchy;
}
// ์ถ๊ฐ์ ์ธ ์ค์
}
โ๏ธAuthorize HttpServletRequests
Spring Security๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ ์์ค์์ ๊ถํ์ ๋ชจ๋ธ๋ง ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, Spring Security๋ฅผ ์ฌ์ฉํ๋ฉด /admin ํ์์ ๋ชจ๋ ํ์ด์ง์๋ ํ๋์ ๊ถํ์ด ํ์ํ๊ณ , ๋ค๋ฅธ ๋ชจ๋ ํ์ด์ง์๋ ๊ฐ๋จํ ์ด์ฆ๋ง ํ์ํ๋ค๊ณ ํ ์ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Spring Security๋ ๋ชจ๋ ์์ฒญ์ ์ธ์ฆ์ด ํ์ํ๋ค. ๊ทธ๋ ์ง๋ง HttpSecurity ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ง๋ค ๊ถํ ๋ถ์ฌ ๊ท์น์ ์ ์ธํด์ผ ํ๋ค.
http
.authorizeHttpRequests((authorize) -> authorize
.anyRequest().authenticated()
)
ํด๋น ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์๋ํฌ์ธํธ๊ฐ ์ด๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ ์ธ์ฆ์ด ํ์ํ๋ค๋ ๊ฒ์ Spring Security์ ์๋ ค์ค๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก AuthorizationFilter๋ Spring Security ํํฐ ์ฒด์ธ์์ ๋ง์ง๋ง์ ์์นํ๋ค. ๋ฐ๋ผ์ ๊ทธ ์ด์ ์ ์กด์ฌํ๋ ์ธ์ฆ, ์ ์ฉ๋ฐฉ์ง๋ฑ์ ํํฐ๋ ๊ถํ์ด ํ์ํ์ง ์๋ค. AuthorizationFilter ์ด์ ์ ์์ฒด ํํฐ๋ฅผ ์ถ๊ฐํด๋ ์ด ํํฐ๋ ๊ถํ์ด ํ์ํ์ง ์๋ค. ๊ทธ๋ฌ๋ Spring MVC ์๋ํฌ์ธํธ๋ฅผ ์ถ๊ฐํ ๋๋ ์ํฉ์ด ๋ฌ๋ผ์ง๋ค. DispatcherServlet์ ์ํด ์คํ๋๋ฏ๋ก ์ด๋ AuthorizationFilter ์ดํ์ ์คํ๋๋ฉฐ, ์๋ํฌ์ธํธ๊ฐ ํ์ฉ๋๋ ค๋ฉด authorizeHttpRequests์ ํฌํจ๋์ด์ผ ํ๋ค.
๋ค์์ /endpoint๊ฐ USER ๊ถํ์ ๊ฐ์ง ์ต์ข ์ฌ์ฉ์์ ์ํด์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์๊ตฌํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
@Bean
SecurityFilterChain web(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/endpoint").hasAuthority("USER")
.anyRequest().authenticated()
)
// ...
return http.build();
}
๋ง์ฝ /endpoint๊ฐ ์๋ํฌ์ธํธ๊ฐ ์๋ /resource ๋๋ ํฐ๋ฆฌ ์๋์ ๋ชจ๋ ์๋ํฌ์ธํธ๋ฅผ ๋งค์นญํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค. ์ด๋ ์์ฒญ์ด /resource ๋๋ ํ์ ๋๋ ํฐ๋ฆฌ์ธ ๊ฒฝ์ฐ USER ๊ถํ์ ์๊ตฌํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ์ฆ๋ง ํ์๋ก ํ๋ค๊ณ ์ฝ์ ์ ์๋ค.
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/resource/**").hasAuthority("USER")
.anyRequest().authenticated()
)
๋ํ, ์๋์ ๊ฐ์ด ๊ฒฝ๋ก์์ ๊ฒฝ๋ก ๊ฐ์ ์ถ์ถํ ์๋ ์๋ค.
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/resource/{name}").access(new WebExpressionAuthorizationManager("#name == authentication.name"))
.anyRequest().authenticated()
)
์ ๊ทํํ์์ ์ด์ฉํ์ฌ ๋งค์นญ์ด ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ด๋ฆ์ ํฌํจํ๊ณ ๋ชจ๋ ์ฌ์ฉ์ ์ด๋ฆ์ด ์ํ๋ฒณ๊ณผ ์ซ์๋ก๋ง ์ด๋ฃจ์ด์ ธ์ผ ํ๋ ๊ท์น์ด ์๋ ๊ฒฝ์ฐ RegexRequestMatcher๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ท์น์ ์ค์ํ ์ ์๋ค.
์๋์ ์ฝ๋๋ ์์ฒญ์ด /resouce/[A-Za-z0-9]+์ ์ผ์นํ๋ฉด USER ๊ถํ์ ์๊ตฌํ๊ณ , ๊ทธ๋ ์ง ์์ ๋ชจ๋ ์์ฒญ์ ๊ฑฐ๋ถํ๋ค๊ณ ์ฝ์ ์ ์๋ค.
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers(RegexRequestMatcher.regexMatcher("/resource/[A-Za-z0-9]+")).hasAuthority("USER")
.anyRequest().denyAll()
)
HTTP ๋ฉ์๋๋ณ๋ก ๊ท์น์ ๋งค์นญํ ์๋ ์๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ถ์ฌ๋ ๊ถํ ๊ธฐ์ค์ผ๋ก ๊ถํ์ ๋ถ์ฌํ ๋์ด๋ค.
์๋ฅผ ๋ค์ด, ๋ชจ๋ GET ์์ฒญ์ด ์ฝ๊ธฐ ๊ถํ์ ๊ฐ์ ธ์ผ ํ๊ณ , ๋ชจ๋ POST ์์ฒญ์ด ์ฐ๊ธฐ ๊ถํ์ ๊ฐ์ ธ์ผ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers(HttpMethod.GET).hasAuthority("read")
.requestMatchers(HttpMethod.POST).hasAuthority("write")
.anyRequest().denyAll()
)
์์ ๋ค์ํ ์์ ์ ๊ฐ์ด ์์ฒญ์ด ์ผ์นํ๋ฉด permitAll, denyAll, hasAuthority์ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ธ์ฆํ ์ ์๋ค.
DSL์ ๋ด์ฅ๋ ๊ถํ ๋ถ์ฌ ๊ท์น์ ์๋์ ๊ฐ๋ค.
permitAll : ์์ฒญ์ ๋ํ ์ธ์ฆ์ด ํ์ํ์ง ์์ผ๋ฉฐ ๊ณต๊ฐ ์๋ํฌ์ธํธ. ์ด ๊ฒฝ์ฐ์๋ ์ธ์ ์์ ์ธ์ฆ์ ๊ฐ์ ธ์ค์ง ์๋๋ค.
denyAll : ์ด๋ ํ ๊ฒฝ์ฐ์๋ ์์ฒญ์ ํ์ฉํ์ง ์๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ์ธ์ ์์ ์ธ์ฆ์ ๊ฐ์ ธ์ค์ง ์๋๋ค.
hasAuthority : ์ธ์ฆ์ด ์ฃผ์ด์ง ๊ฐ๊ณผ ์ผ์นํ๋ GrantedAuthortiy๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
hasRole : ROLE_ ์ ๋์ฌ๋ฅผ ์ถ๊ฐํ์ฌ hasAuthority์ ๋จ์ถํค์ด๋ค.
hasAnyAuthority : ์ธ์ฆ์ด ์ฃผ์ด์ง ๊ฐ ์ค ํ๋์ ์ผ์นํ๋ GrantedAuthority๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
hasAnyRole : ROLE_ ์ ๋์ฌ๋ฅผ ์ถ๊ฐํ์ฌ hasAnyAuthority์ ๋จ์ถํค์ด๋ค.
access : ์ฌ์ฉ์ ์ ์ AuthorizationManager๋ฅผ ์ฌ์ฉํ์ฌ ์ก์ธ์ค๋ฅผ ๊ฒฐ์ ํ๋ค.
Security Matchers๋ฅผ ์ฌ์ฉํ์ฌ HttpSecurity๋ฅผ ์ ์ฉํ ์์ฒญ์ ๊ฒฐ์ ํ ์ ์๋ค.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.securityMatcher("/api/**")
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/user/**").hasRole("USER")
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(withDefaults());
return http.build();
}
}
์์ ์ฝ๋์ ๊ฒฝ์ฐ /api/user, /api/admin๊ณผ ๊ฐ์ ๊ฒฝ๋ก๋ก ์์ฒญ์ด ๋ค์ด์จ ๊ฒฝ์ฐ์ authorizHttpRequest ์ค์ ์ด ๋๋ค๋ ์๋ฏธ๋ก,
๋ณด์ ํํฐ ์ฒด์ธ์ ๋ํ ์ค์ ์ด ์ ์ฉ๋๋ ์์ฒญ์ ์ง์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
'Study > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Base64 Encoding vs Base64UrlSafe vs FormData (1) | 2024.11.05 |
---|---|
Spring Security ์ ์ฉ๊ธฐ (7) Spring Security Authorization(Method Security) (0) | 2024.05.06 |
Spring Security ์ ์ฉ๊ธฐ (5) Spring Security Authentication ๋์์๋ฆฌ (0) | 2024.05.05 |
Spring Security ์ ์ฉ๊ธฐ (3) JWT(JSON Web Tokens) ๊ฐ๋ (0) | 2024.04.29 |
Spring Security ์ ์ฉ๊ธฐ (2) Spring Security Configuration (0) | 2024.04.25 |