728x90
spring security 의 csrf 설정 시 csrf 값이 없으면 페이지가 정상적으로 로드되지 않고 403 forbidden 권한없음 에러가 발생 됩니다.
1. CSRF란?
CSRF(Cross-Site Request Forgery)는 악의적인 사이트에서 사용자의 인증된 세션을 도용해, 사용자가 의도하지 않은 요청을 실행하도록 만드는 공격입니다. 이를 통해 공격자는 사용자 대신 원하지 않는 행동을 수행할 수 있으며, 예를 들어 게시글 삭제, 계정 변경, 금전 송금 등과 같은 중요한 작업이 이루어질 수 있습니다.
2. CSRF 보호의 필요성
CSRF 공격은 사용자의 권한을 이용하여 악의적인 요청을 보내는 방식이기 때문에, 이를 방지하지 않으면 중요한 정보를 탈취하거나 악성 행위를 수행할 수 있습니다. Spring Security는 기본적으로 CSRF 공격을 방어하기 위한 보안 메커니즘을 제공하여, 모든 POST, PUT, DELETE 요청 등에 대해 CSRF 토큰 검사를 수행합니다.
3. CSRF를 제외해야 하는 경우
일부 특정 URL에 대해서는 CSRF 보호가 필요하지 않을 때도 있습니다. 예를 들어:
- 외부에서 호출될 API 엔드포인트는 사용자가 브라우저에서 직접 접근하는 것이 아니므로 CSRF 보호가 불필요할 수 있습니다.
- 파일 다운로드 URL이나 외부 서비스와의 연동을 위한 콜백 URL 등도 CSRF 토큰 검사를 제외하는 경우가 많습니다.
4. Spring Security에서 CSRF 특정 URL 제외 설정 방법
코드 예제:
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.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.ignoringAntMatchers("/api/public/**", "/webhook/**") // CSRF 제외할 URL 설정
.and()
.authorizeRequests()
.antMatchers("/api/public/**", "/webhook/**").permitAll() // 해당 URL 허용
.anyRequest().authenticated();
}
}
설명:
- csrf().ignoringAntMatchers("/api/public/**", "/webhook/**"): /api/public/**와 /webhook/**로 시작하는 URL에 대해서는 CSRF 검사를 수행하지 않습니다.
- antMatchers("/api/public/**", "/webhook/**").permitAll(): 해당 URL에 대해서는 인증 없이 접근이 가능하도록 허용합니다.
5. CSRF 제외가 필요한 이유와 예시
외부 API와의 연동
- 예를 들어, 외부 시스템이 API 호출을 통해 데이터를 전송하거나 받을 때, 이 API는 브라우저에서 실행되는 것이 아니므로 CSRF 보호가 필요하지 않습니다. 이러한 경우 CSRF를 제외할 수 있습니다.
웹훅(Webhook) 처리
- 외부 서비스가 서버에 POST 요청을 통해 특정 작업을 알리는 웹훅의 경우에도 CSRF 검사가 필요하지 않습니다. 이때는 해당 URL을 CSRF 보호에서 제외하는 것이 일반적입니다.
이처럼 사용자가 직접 브라우저를 통해 접근하는 URL이 아니거나, 외부 시스템과 통신하는 API에 대해서는 CSRF 보호를 제외하는 것이 적절할 수 있습니다.
LIST
'Develop > JAVA' 카테고리의 다른 글
[Spring Boot] application.yml 변수 Java Static 변수에서 사용하는 방법 (12) | 2024.10.15 |
---|---|
[Java] 현재 서버 도메인 정보 갖고오기 (13) | 2024.09.26 |
[Java] GET POST 메서드 REST API 호출 서비스 만들기 (6) | 2024.09.25 |
[Java] forEach 와 Stream API를 사용한 배열 처리 (9) | 2024.09.24 |
[Spring Framework] Spring boot 2개 실행했을 때 로그인 세션 끊기는 현상 해결하기 (8) | 2024.09.14 |