Spring - Authentication, Spring Security

JungWooLee·2022년 9월 25일
0
post-thumbnail

Spring Security 에 대한 아무런 설정 사항이 없다면 서비스를 모든 사용자가 사용할 수 있을 것이다

사용해보기

다음과 같이 디펜던시를 추가해줍니다

이후 프로젝트 실행한 뒤 로그를 살펴보면 다음과 같이 비밀번호가 설정되는 것을 알 수 있습니다

스프링 시큐리티가 적용되고 나면 프로젝트내의 rest api 에 접근하려고 하면 인증 절차를 거치지 않았기에 login 페이지로 리다이렉트 시켜줍니다

Spring Security 에 대한 별다른 설정사항을 수정하지 않았다면 username = user, password = {프로젝트 실행시 생성된 security password} 가 된다

설정해보기

비밀번호의 경우 매번 프로젝트가 재실행 될 때마다 새롭게 바뀐다. 만약 고정적인 password 를 설정하고 싶다면 ?

  • application.properties 수정
  • user.name 을 통하여 username, user.password 를 통하여 password 재설정

동작 살펴보기

애플리케이션 내에서 요청을 보내게 되면 spring security 는 요청을 인터셉트한다.
가령 /users 로 API 에 접근하려고 했다면, security가 요청을 가로채고 여러 필터를 거치게 된다
이러한 여러 필터들을 필터체인이라고 부른다


필터체인

필터체인에서 수행되는 필터링은 다음과 같다

  1. 모든 요청은 인증이 되어있어야 한다. 즉, 어떠한 요청을 보내든 크리덴셜이 동반되어야한다
  2. 만약 요청이 인증을 거치지 않았다면 로그인 화면으로 리다이렉션 해준다
  3. CSRF check → Post, Put 요청들에 영향을 줌

설정해보기

기존 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();
    }
}
  • @Configuration 으로 직접 설정할 수 있게 해준다
  • httpSecurity 의 authorizeHttpRequests 에서 모든 요청이 인증을 거쳐야 함을 설정해준다
  • httpSecurity.httpBasic(Customizer.withDefaults()) : 기존의 웹 html 에서 거쳐야 했던 인증 절차를 팝업을 통하여 인증절차를 거치도록 수정 (RestAPI에서 웹 형식은 맞지 않기 때문)
  • httpSecurity.csrf().disable() 를 통하여 csrf 를 비활성화 해줍니다

CSRF 란?

CSRF란 웹 애플리케이션의 취약점 중 하나로, 이용자가 의도하지 않은 요청을 통한 공격을 의미

CSRF(Cross-Site Request Forgery)는 "사이트 간 요청"이 발생하기 쉬운 웹에 대해 요청할 때 필요하게 된느데 이러한 애플리케이션은 보통 템플릿 엔진(Thymeleaf, JSP)등을 사용하여 서버 측에서 전체 HTML을 생성하는 구조이다

하지만 최신의 애플리케이션은 주로 REST API의 앤드포인트에 의존하는 구조이고 이러한 앤드포인트는 대부분 JSON 방식으로 통신을 하도록 설계가 되어있다

즉, RestAPI 에서는 CSRF 로 인해 공격받을 가능성이 없다. 그렇기에 자동으로 CSRF 를 설정해주었던 스프링 시큐리티에서 비활성화 시킨것

0개의 댓글