programing

스프링 보안, 상태 비저장 REST 서비스 및 CSRF

bestprogram 2023. 6. 21. 22:49

스프링 보안, 상태 비저장 REST 서비스 및 CSRF

저는 Java, Spring-boot 및 Spring Security와 Basic Access Authentication을 사용하여 구축된 REST 서비스를 가지고 있습니다.Views, JSP 등, '로그인'은 없으며 별도로 호스팅된 React 앱에서 호출할 수 있는 상태 비저장 서비스만 있습니다.

CSRF 보호에 대한 다양한 설명서를 읽었지만 스프링 보안 CSRF 구성을 사용해야 할지 아니면 사용하지 않도록 설정해야 할지 결정할 수 없습니다.csrf 보호를 비활성화하면 다음과 같은 기본 인증을 사용하여 curl로 서비스를 호출할 수 있습니다.

curl -H "authorization:Basic c35sdfsdfjpzYzB0dDFzaHA=" -H "content-type:application/json" -d '{"username":"user","password":"password","roles":"USER"}' localhost:8081/api/v1/user

하고 csrf 파일을 x-csrf-token내에) " "CsrfFilter" ("CsrfFilter")에 이 값을 합니다.HttpServletRequest그러나 상태 비저장 REST 서비스이기 때문에 세션이 없고 '로그인'하지 않았습니다.

다음과 같은 구성 클래스가 있습니다.

@EnableWebSecurity
@Configuration
public class ServiceSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().fullyAuthenticated()
                .and().httpBasic();
        if (!serviceProperties.isCsrfEnabled()) {
            http.csrf().disable();
        }
    }

생각할수록 CSRF 보호를 해제해야 할 것 같습니다.스프링 보안을 구성하여 작동하는 다른 방법이 있습니까?

감사해요.

첫 번째 질문에 답하려면 설명한 맥락에서 CSRF 보호가 필요하지 않습니다.CSRF 보호의 배경은 사용자가 원치 않는 작업을 수행하도록 속지 않도록 하기 위한 것입니다.

예를 들어, 순수 이론에서, 당신은 은행의 웹사이트에 로그인하고 (따라서 세션을 설정) 그 다음에 수상한 웹사이트로 갈 수 있었습니다.이 사이트는 은행의 API에 POST 요청을 하는 양식을 가지고 있을 수 있습니다.세션이 있기 때문에 엔드포인트가 CSRF로 보호되지 않으면 요청이 통과될 수 있습니다.

이와 같이 CSRF는 대부분 브라우저 + 세션 기반 공격에 대한 보호 역할을 합니다.예를 들어 순수 REST API를 노출하는 경우.저작권 보호, 그렇다면 CSRF에 대한 어떠한 이유도 보이지 않습니다.

부트를 할 때는 설정할 .application.properties/application.yaml구성 파일.

security.enable-csrf=false

일반 응용 프로그램 속성 문서 페이지에서 자세한 구성 옵션을 확인할 수 있습니다.

csrf를 더 적절한 방법으로 비활성화하고 싶다면 이렇게 부를 수 있습니다(java 구성을 사용하는 경우).

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest().fullyAuthenticated()
            .and().httpBasic();
       .and()
            .csrf()
            .disable()

언급URL : https://stackoverflow.com/questions/48985293/spring-security-stateless-rest-service-and-csrf