[Security] ๊ถํ ์ฒ๋ฆฌ @PreAuthorize, @PostAuthorize, @Secured
by rlaehddnd0422Spring Security๋ Filter๋ฅผ ํตํด ๊ถํ์ ๊ฒ์ฌํ ์๋ ์์ง๋ง, ์ถ๊ฐ์ ์ผ๋ก ํน์ URI์ ์ ๊ทผํ ๋ ๊ถํ์ ๊ฒ์ฌํ์ฌ ํน์ ๊ถํ๋ง ํด๋น URI์ ์ ๊ทผํ ์ ์๋๋ก ๋ณ๋์ ์ด๋ ธํ ์ด์ ์ ์ง์ํฉ๋๋ค.
์ด๋ฐ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ธฐ์ ์์ @Configuration์ด ๋ถ์ ์ค์ ํ์ผ์ ์๋์ ๊ฐ์ด @EnableGlobalMethodSecurity ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐ์ ์ผ๋ก ์ค์ ํ์ฌ ๋ณ๋ ๊ถํ์ฒ๋ฆฌ ์ด๋ ธํ ์ด์ ์ ํ์ฑํ ์ฌ๋ถ๋ฅผ ์ง์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค.
@EnableGlobalMethodSecurity
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, // @Secured ํ์ฑํ
prePostEnabled = true // @PreAuthorized ํ์ฑํ, @PostAuthroized ํ์ฑํ
)
public class SecurityConfig {
- securedEnabled : @Secured ์ด๋ ธํ ์ด์ ํ์ฑํ ์ฌ๋ถ
- prePostEnabled : @PreAuthorized, @PostAuthorized ์ด๋ ธํ ์ด์ ํ์ฑํ ์ฌ๋ถ
@Secured
@Secured(value = "ROLE_ADMIN")
@GetMapping("/info")
@ResponseBody
public String info() {
return "๊ฐ์ธ์ ๋ณด";
}
์ผ๋ฐ์ ์ผ๋ก ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋ ๋ ๋ฒจ์ ๋ถ์ฌ ์ฌ์ฉํ๋๋ฐ, @Secured ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ปจํธ๋กค๋ฌ์ ๋งคํ๋ URI๊ฐ ํธ์ถ๋๋ฉด ๋ฉ์๋ ์คํ ์ , @Secured์ value์ ๊ถํ์ ๊ฐ๋์ง ์ฌ๋ถ๋ฅผ ๋จผ์ ํ์ธํ๊ณ , ๊ถํ์ ๊ฐ๋ ๊ฒฝ์ฐ์๋ง ํด๋น ๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค.
@PreAuthroize
// 2๊ฐ ์ด์ ๊ฑธ๊ณ ์ถ์๋
@PreAuthorize("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
@GetMapping("/data")
@ResponseBody
public String data() {
return "๋ฐ์ดํฐ์ ๋ณด";
}
@Secured ์ ๋ฌ๋ฆฌ ์กฐ๊ฑด์์ ์ฌ์ฉํ์ฌ ์ ๊ทผ ๋ ๋ฒจ์ ์ค์ ํ ์ ์์ต๋๋ค.
+ ์กฐ๊ฑด์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ AND, OR์ ์ฌ์ฉํ์ฌ ์ ๊ทผ๋ ๋ฒจ์ ์ฌ๋ฌ ๊ฐ ์ค์ ํ ์ ์์ต๋๋ค.
ํํ์ ์ข ๋ฅ
- hasRole([role]) : ํ์ฌ ์ฌ์ฉ์์ ๊ถํ์ด ํ๋ผ๋ฏธํฐ์ ๊ถํ๊ณผ ๋์ผํ ๊ฒฝ์ฐ true
- hasAnyRole([role1,role2]) : ํ์ฌ ์ฌ์ฉ์์ ๊ถํ๋ ํ๋ผ๋ฏธํฐ์ ๊ถํ ์ค ์ผ์นํ๋ ๊ฒ์ด ์๋ ๊ฒฝ์ฐ true
- principal : ์ฌ์ฉ์๋ฅผ ์ฆ๋ช ํ๋ ์ฃผ์๊ฐ์ฒด(User)๋ฅผ ์ง์ ์ ๊ทผํ ์ ์๋ค.
- authentication : SecurityContext์ ์๋ authentication ๊ฐ์ฒด์ ์ ๊ทผ ํ ์ ์๋ค.
- permitAll : ๋ชจ๋ ์ ๊ทผ ํ์ฉ
- denyAll : ๋ชจ๋ ์ ๊ทผ ๋นํ์ฉ
- isAnonymous() : ํ์ฌ ์ฌ์ฉ์๊ฐ ์ต๋ช (๋น๋ก๊ทธ์ธ)์ธ ์ํ์ธ ๊ฒฝ์ฐ true
- isRememberMe() : ํ์ฌ ์ฌ์ฉ์๊ฐ RememberMe ์ฌ์ฉ์๋ผ๋ฉด true
- isAuthenticated() : ํ์ฌ ์ฌ์ฉ์๊ฐ ์ต๋ช ์ด ์๋๋ผ๋ฉด (๋ก๊ทธ์ธ ์ํ๋ผ๋ฉด) true
- isFullyAuthenticated() : ํ์ฌ ์ฌ์ฉ์๊ฐ ์ต๋ช ์ด๊ฑฐ๋ RememberMe ์ฌ์ฉ์๊ฐ ์๋๋ผ๋ฉด true
@PostAuthorize
@PostAuthorize("isAuthenticated() and (( returnObject.name == principal.name ) or hasRole('ROLE_ADMIN'))")
@RequestMapping( value = "/{id}", method = RequestMethod.GET )
public Project getProject( @PathVariable("id") long id ){
return service.findOne(id);
}
@PostAuthorize ์ด๋ ธํ ์ด์ ์ ํจ์๋ฅผ ์คํํ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ํ๊ธฐ ์ง์ ์ ๊ถํ์ ๊ฒ์ฌํ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
returnObject ์์ฝ์ด๋ฅผ ํตํด ๋ฉ์๋์ ๋ฆฌํด ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
https://ggotae.tistory.com/entry/Secured-PreAuthorize-%EB%B9%84%EA%B5%90
https://steemit.com/kr-dev/@igna84/spring-security-preauthorize-postauthorize
https://bigdown.tistory.com/465
'๐ Backend > Spring Security' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Security] OAuth2.0 ๋ค์ด๋ฒ, ์นด์นด์ค ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ถ๊ฐ (0) | 2023.06.01 |
---|---|
[Security] OAuth2.0 ๋ก๊ทธ์ธ ํ์ฒ๋ฆฌ - ๊ถํ ๋ถ์ฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ (0) | 2023.05.31 |
[Security] OAuth2.0์ ์ด์ฉํ ์์ ๋ก๊ทธ์ธ (๊ตฌ๊ธ) (0) | 2023.05.31 |
[Security] Security ํ์๊ฐ์ , ๋ก๊ทธ์ธ (0) | 2023.05.29 |
[Security] Spring Security๋? (1) | 2023.05.29 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422