Spring Security 에 대한 아무런 설정 사항이 없다면 서비스를 모든 사용자가 사용할 수 있을 것이다
다음과 같이 디펜던시를 추가해줍니다
이후 프로젝트 실행한 뒤 로그를 살펴보면 다음과 같이 비밀번호가 설정되는 것을 알 수 있습니다
스프링 시큐리티가 적용되고 나면 프로젝트내의 rest api 에 접근하려고 하면 인증 절차를 거치지 않았기에 login 페이지로 리다이렉트 시켜줍니다
Spring Security 에 대한 별다른 설정사항을 수정하지 않았다면 username = user, password = {프로젝트 실행시 생성된 security password} 가 된다
비밀번호의 경우 매번 프로젝트가 재실행 될 때마다 새롭게 바뀐다. 만약 고정적인 password 를 설정하고 싶다면 ?
application.properties
수정 애플리케이션 내에서 요청을 보내게 되면 spring security 는 요청을 인터셉트한다.
가령 /users
로 API 에 접근하려고 했다면, security가 요청을 가로채고 여러 필터를 거치게 된다
이러한 여러 필터들을 필터체인이라고 부른다
필터체인에서 수행되는 필터링은 다음과 같다
기존 Spring 컨테이너가 Auto configure 해주었던 Security Filters 를 직접 설정한다
@Configuration
public class SpringSecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
//ensure that all request authenticated
httpSecurity.authorizeHttpRequests(
auth -> auth.anyRequest().authenticated()
);
//for restapi, enable basic authentication
httpSecurity.httpBasic(Customizer.withDefaults());
// CSRF -> POST, Put
httpSecurity.csrf().disable();
return httpSecurity.build();
}
}
CSRF란 웹 애플리케이션의 취약점 중 하나로, 이용자가 의도하지 않은 요청을 통한 공격을 의미
CSRF(Cross-Site Request Forgery)는 "사이트 간 요청"이 발생하기 쉬운 웹에 대해 요청할 때 필요하게 된느데 이러한 애플리케이션은 보통 템플릿 엔진(Thymeleaf, JSP)등을 사용하여 서버 측에서 전체 HTML을 생성하는 구조이다
하지만 최신의 애플리케이션은 주로 REST API의 앤드포인트에 의존하는 구조이고 이러한 앤드포인트는 대부분 JSON 방식으로 통신을 하도록 설계가 되어있다
즉, RestAPI 에서는 CSRF 로 인해 공격받을 가능성이 없다. 그렇기에 자동으로 CSRF 를 설정해주었던 스프링 시큐리티에서 비활성화 시킨것