스프링 시큐리티를 처음 빌드하고나서 페이지에 접근을 하게되면
이러한 로그인 창이 뜬다.
시큐리티를 사용하기 전에는 뜨지 않았고 내가 따로 설정하지 않았는데 갑자기 뜨는 이유가 뭘까?
스프링 시큐리티에서는 보안 설정을 쉽게 사용할 수 있도록 여러 가지 기본값을 제공합니다.
그 중에서 직접 재정의를 하지 않으면 SpringBootWebSecurityConfiguration 클래스에 있는 defaultSecurityFilterChain의 기본 설정을 따라갑니다.
(SpringBootWebSecurityConfiguration 클래스는 스프링 부트에서 자동으로 제공되는 클래스 중 하나입니다.)
첫 줄을 보면
http.authorizeHttpRequests((requests) -> { ((AuthorizeHttpRequestsConfigurer.AuthorizedUrl)requests.anyRequest()).authenticated(); });
anyRequest(들어오는 모든 요청)에 authenticated(자격 증명)를 하라고 되어 있습니다.
그래서 저희가 따로 설정하지 않았지만 모든 요청에 대해 자격 증명을 위한 로그인 화면이 뜬 것 입니다.
하지만 어떠한 요청에는 자격 증명이 필요없고 어떠한 요청에는 자격증명이 필요한 상황이 대부분 입니다.
예를들어 한국 게임중 피파라는 게임을 하고싶다면 홈페이지에 들어가서 로그인을 하고 게임 시작을 하면 됩니다.
하지만 게임을 하기 전 홈페이지에 들어가는 것과 홈페이지를 둘러보는 것은 자격 증명이 필요하지 않습니다.
그래서 이러한 설정을 하기위해서는 위 메서드를 오버라이딩 하면 되는데 한 번 해보겠습니다.
http.authorizeRequests(authorize -> authorize
.requestMatchers("/gameStart", "/myPage").authenticated()
.requestMatchers("/home", "/notices").permitAll())
.formLogin(Customizer.withDefaults())
.httpBasic(Customizer.withDefaults());
return http.build();
- requestMatchers(url) -> url의 갯수는 무제한이며 인자값으로 넘겨준 url에대한 권한 설정
- authenticated -> 인증이 필요함
- permitAll -> 누구든지 접근 가능
코드를 해석해 보면 "/gameStart"와 "myPage"에 대해서는 보안을 걸어서 자격 증명을 요구하고 증명이 된 유저에게만 접근이 허용되고,
"/home"과 "/notices"에 증명이 된 유저와 안 된 유저 다 접근이 가능합니다.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
많이 사용되지 않고 운영에서 추천하지는 않지만 알아두어서 나쁘지 않을 메서드 한 가지를 알아보겠습니다.
http.authorizeRequests(authorize -> authorize
.anyRequest().denyAll())
.formLogin(Customizer.withDefaults())
.httpBasic(Customizer.withDefaults());
return http.build();
- anyRequest() -> 모든 request에 대한 권한 설정
- denyAll() -> 어떠한 작업도 허용하지 않음 자격 증명을 해도 403에러가 뜸.
denyAll() 방식이 운영에서 추천하지 않는 방식이라고 하지만, 특정 요청에 대해 완벽하게 막고자할 때 사용할 수 있다고 생각합니다.
ex) 계좌 잔액에 대한 접근
요청이 거부되는 방식
요청을 거부하려면 먼저 요청에 대한 인증을 해야 하기 때문에 자격 증명을 하게 되고,
증명에 성공하면 인증도 성공되지만 어떠한 작업도 허용하지 않기 때문에 에러를 반환합니다.
'스프링' 카테고리의 다른 글
Spring - ComponentScan(feat. Autowired) (0) | 2024.04.18 |
---|---|
Spring - Spring Container와 Dependency Injection (1) | 2024.04.11 |
스프링 시큐리티 내부 흐름 (1) | 2023.12.18 |
스프링 DI (0) | 2023.12.17 |
JPA N + 1 문제와 해결 방법 (0) | 2023.11.14 |