MSA

[MSA] Part 11. User Service (WebSecurity)

cwchoiit 2024. 1. 8. 10:20
728x90
반응형
SMALL

유저 서비스에서 Security 관련 설정을 진행해보자. 사실 지금 딱히 Security 관련 설정할 내용이 있는건 아니다만 구현하고자 하는 서비스는 웹 관련 서비스가 아니기 때문에 설정해주면 좋을만한게 있다.

728x90
SMALL

 

WebSecurity

다른 설정 파일과 똑같이 @Configuration 애노테이션으로 클래스를 만들고 그 안에 @Bean 등록으로 설정 내용을 적용하면 된다. 


WebSecurity

package springmsa.springmsa_user_service.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class WebSecurity {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable);

        http.authorizeHttpRequests((requests) -> requests.requestMatchers("/users/**").permitAll());

        return http.build();
    }
}

 

추후에 설정 내용이 더 추가될 예정이다. 지금은 저 csrf를 disable()하는것에 초점을 두자. 우선 csrf는 무엇인지부터 확인해보자.

csrf

Cross Site Request Forgery의 약자로 사이트 간 위조 요청을 말한다. 이는 정상적인 유저가 의도치 않게 비정상적인 요청을 하는 것을 말하는데 특정 사이트에 정상 권한을 가지고 있는 유저에게 비정상적인 링크를 누군가가 보내고 그 링크를 아무런 의심없이 해당 유저가 클릭할 때 역시 이 비정상적인 요청을 할 수 있다. 그리고 해당 사이트는 이러한 요청에 대해 이 사용자가 악용된 사용자인지 일반 유저인지 구분할 수 없다. 

 

그래서 이를 방어하기 위해 csrf 토큰을 웹 사이트에서는 부여하여 이 토큰이 요청에 포함되어야만 요청을 받아들인다. 그럼 csrf를 왜 disable()했을까?

 

REST API만을 사용한다면 CSRF는 의미가 없다. Spring security 문서를 보면 non-browser-clients만을 위한 서비스라면 csrf를 disable해도 상관이 없다. REST API만을 이용하는 클라이언트는 요청 시 요청에 인증 정보(예: JWT)를 포함하여 요청하고 서버에서 인증 정보를 저장하지 않기 때문에 굳이 불필요한 csrf 코드들을 포함할 필요가 없는것이다. 

 

 

그니까 결론은, 브라우저를 이용하지 않고 모든 요청은 REST API로 들어온다면 CSRF 관련 코드를 빼주는 게 더 효율적인 서비스가 될 수 있다. 

 

 

authorizeHttpRequests()

두번째 라인은 특정 패턴의 요청이 들어왔을 때 요청을 허용할지에 대한 코드이다. 다음 코드를 보자.

http.authorizeHttpRequests((requests) -> requests.requestMatchers("/users/**").permitAll());

 

요청에 "/users/**" 패턴이 있으면 어떤 요청이든지 허가하겠다는 코드이다. 추후에 변경할 예정이지만 일단은 이렇게 해두자. 인증 관련 설정은 추후에 계속 할 예정이다.

728x90
반응형
LIST