CSRF(Cross Site Request Forgery) 란 '사이트 간 요청 위조' 의 줄임말로,
웹 애플리케이션 취약점 중 하나로 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 해서 특정 웹페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격 방법이다.
해커들은 링크나 이미지 클릭을 유도해 사용자의 정보를 얻거나, 해커 본인들의 데이터로 다시 전송하는 등의 공격을 수행한다.
Spring 에서 이를 어떻게 처리할까 ?
1. REST API 설계 시, CSRF
나는 REST API로 프로젝트를 하게되면,
spring security에서 CSRF 를 자동으로 활성화하여 POST 요청 시 에러가 발생하기 때문에 줄곧 disable 처리를 해왔는데, 왜인지는 고민해보지 않았던 것 같다.
이유를 찾아보니,
REST API 는 사용자 정보를 세션에 저장하지 않고 쿠키에 저장하지않는 상태 비저장이고 jwt 와 같은 토큰 인증 시 쿠키에 저장하지 않기때문에 CSRF 로부터 안전하다는 판단 하에 해당 기능을 비활성화 한다고 한다.
- 적용 방법
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
http
.csrf(csrf -> csrf.disable());
}
}
2. Spring MVC 설계 시, CSRF
스프링 시큐리티를 사용할 경우 기본적으로 모든 POST 방식의 데이터 전송에는 CSRF 토큰 값이 있어야 한다.
CSRF 토큰은 실제 서버에서 허용한 요청이 맞는지 확인하기 위한 토큰이다.
사용자의 세션에 임의의 값을 저장하여 요청마다 그 값을 포함하여 전송하면, 서버에서 세션에 저장된 값과 요청이 온 값이 일치하는지 확인하여 CSRF를 방어한다.
- 적용 방법 ( thymeleaf )
<html>
..
<input type="hidden" th:name="${_csrf.parameter}" th:value="${_csrf.token}">
</html>
정리
적용 방법이 어렵지않고 필수적인 내용이라 빼먹지 않고 적용하는 것이 중요하다.
이 외에도 시큐어 코딩 가이드에 따라 코딩하는 습관을 기르자.
참고
'Web' 카테고리의 다른 글
[Spring] Exception Handling 에 대해서 (3) | 2023.07.03 |
---|---|
[Spring] @Builder 와 Builder 패턴 (0) | 2023.06.25 |
[Spring] @Email 과 이메일 정규식 표현 (0) | 2023.06.24 |
[Spring] Gradle 과 Maven 에 대해서 (0) | 2023.06.22 |
[Spring] HikariCP 와 Pool Size에 대해서 (0) | 2023.06.18 |