- CSRF(Cross Site Request Forgery) : 사용자가 웹에 로그인 한 상태에서 악성 스크립트 등을 통해 원하지 않는 변경(POST, PUT, DELETE)를 할 수 있는 것을 대비하기 위한 기능이다. (예시로, 페이스북에 로그인된 상태에서 원하지 않는 광고글이 게시되는 등)
- GET호출시에 CSRF 토큰을 발급하며, 변경(POST등) 메서드를 하고자 할 경우에는 헤더에 X_CSRF_TOKEN에 토큰값을 넘겨줘야 정상적으로 변경을 수행한다.
아래와 같이 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();
}
}
반응형