자바/Spring

Spring Security CSRF와 CORS

끄적끄적 2023. 9. 17. 21:24
  • CSRF(Cross Site Request Forgery) : 사용자가 웹에 로그인 한 상태에서 악성 스크립트 등을 통해 원하지 않는 변경(POST, PUT, DELETE)를 할 수 있는 것을 대비하기 위한 기능이다. (예시로, 페이스북에 로그인된 상태에서 원하지 않는 광고글이 게시되는 등)
  • GET호출시에 CSRF 토큰을 발급하며, 변경(POST등) 메서드를 하고자 할 경우에는 헤더에 X_CSRF_TOKEN에 토큰값을 넘겨줘야 정상적으로 변경을 수행한다.

CSRF 처리

 

아래와 같이 hidden값으로 클라이언트에서 변경시 token값을 올려주도록 구현할 수 있다.

<!DOCTYPE HTML>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
    </head>
    <body>
        <form action="/product/add" method="post">
            <span>Name:</span>
            <span><input type="text" name="name" /></span>
            <span><button type="submit">Add</button></span>
            <input type="hidden"
                    th:name="${_csrf.parameterName}"
                    th:value="${_csrf.token}" />
        </form>
    </body>
</html>

 

  • CORS(Cross-Origin Resource Sharing) : 보안상의 이유로 브라우저는 동일출처(도메인, 포트)가 아니면 호출을 제한한다. 이를 허용해 주기 위한 공유이다.
    • Access-Control-Allow-Origin : 접근할 수 있는 외부 도메인 지정
    • Access-Control-Allow-Methods : 특정 HTTP 방식만 허용
    • Access-Control-Allow-Headers : 특정요청에 이용할 수 있는 헤더 제한 추가

  •  
  • 허용방법
    • Controller에 @CrossOrigin 추가
    • CorsConfigurer로 전체적으로 적용
public class ProjectConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors(c -> {
            CorsConfigurationSource source = request -> {
                CorsConfiguration config = new CorsConfiguration();
                config.setAllowedOrigins(List.of("*"));
                config.setAllowedMethods(List.of("*"));
                return config;
            };
            c.configurationSource(source);
        });

        http.csrf().disable();

        http.authorizeRequests()
                .anyRequest().permitAll();
    }
}
반응형