프로젝트

일반

사용자정보

CSRF (Cross-Site Request Forgery)란?

Prof. Jong Min Lee이(가) 14일 전에 추가함

Spring Security에서 filterChain()을 정의할 때 CSRF(크로스 사이트 요청 위조, Cross-Site Request Forgery) 보호는 웹 애플리케이션의 보안 강화를 위한 중요한 요소 중 하나입니다. CSRF 공격은 사용자가 인증된 상태에서 악의적인 요청을 실행하도록 유도하는 공격 방식입니다.

CSRF의 역할

CSRF 보호는 웹 애플리케이션이 신뢰할 수 없는 출처에서 발생한 요청을 차단하도록 도와줍니다. Spring Security에서 CsrfFilter는 다음과 같은 방식으로 작동합니다:

  1. CSRF 토큰 생성 및 검증

    • Spring Security는 서버에서 CSRF 토큰을 생성하고 이를 사용자 세션에 저장합니다.
    • 클라이언트(예: 웹 페이지)는 요청을 보낼 때 해당 CSRF 토큰을 포함해야 합니다.
    • 서버는 이 토큰을 검증하여 요청이 신뢰할 수 있는 출처에서 온 것인지 확인합니다.
  2. POST, PUT, DELETE 요청 보호

    • 기본적으로 Spring Security는 상태를 변경하는 요청(POST, PUT, DELETE 등)에 대해 CSRF 보호를 활성화합니다.
    • GET 요청은 데이터를 조회하는 작업이므로 CSRF 보호가 적용되지 않습니다.
  3. Spring Security 설정에서 CSRF 활성화 및 비활성화

    • Spring Security 6 기준으로, 기본적으로 CSRF 보호가 활성화되어 있습니다.
    • 필요에 따라 비활성화할 수도 있지만, 보안 취약점을 초래할 수 있으므로 신중히 고려해야 합니다.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .csrf(csrf -> csrf.disable()) // CSRF 보호 비활성화
        .authorizeHttpRequests(auth -> auth
            .anyRequest().authenticated())
        .formLogin(withDefaults());
    return http.build();
}

CSRF 보호를 고려해야 할 경우

CSRF 보호는 특히 다음과 같은 경우에 유용합니다:
- 사용자가 로그인해야 하는 웹 애플리케이션: 사용자의 인증 정보를 악용하는 공격을 방지합니다.
- 폼 기반 요청을 사용하는 애플리케이션: 사용자가 입력한 데이터를 서버에 제출할 때 CSRF 보호를 적용해야 합니다.
- REST API 사용 시 고려해야 할 점: 대부분의 REST API에서는 JWT 인증을 사용하여 CSRF를 비활성화할 수도 있지만, 필요에 따라 헤더 기반의 CSRF 토큰을 사용할 수도 있습니다.

Spring Security에서 filterChain()을 정의할 때, CSRF 보호를 어떻게 설정할지 고민해야 합니다. 특히 API 서버라면 csrf().disable()을 고려할 수 있지만, 웹 애플리케이션에서는 CSRF 보호를 유지하는 것이 보안적으로 더 안전한 선택입니다.


답글 (1)

Spring Security 적용 시 CSRF 사용법 - Prof. Jong Min Lee이(가) 14일 전에 추가함

Spring Security를 사용하여 JSP 기반 웹 애플리케이션을 개발할 때 CSRF 보호를 적용하는 방법은 다음과 같습니다.

1. 기본적으로 CSRF 보호 활성화됨

Spring Security는 기본적으로 CSRF 보호 기능을 활성화합니다. 따라서 특별한 설정을 하지 않으면 CSRF 토큰이 자동으로 생성되어 인증된 요청에 대해 검증됩니다.

2. JSP에서 CSRF 토큰 사용하기

CSRF 보호를 적용하려면 JSP 페이지에서 CSRF 토큰을 폼 데이터에 포함해야 합니다. Spring Security에서는 HttpServletRequest에서 CSRF 토큰을 가져와 사용할 수 있습니다.

<form action="/process" method="post">
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">
    <input type="text" name="username">
    <input type="password" name="password">
    <button type="submit">로그인</button>
</form>

위와 같이 CSRF 토큰을 <input> 태그로 추가하면 Spring Security가 요청을 검증할 수 있습니다.

3. Spring Security 설정에서 CSRF 보호 관리

Spring Security에서 CSRF 보호를 유지하거나 비활성화하려면 SecurityFilterChain을 설정해야 합니다.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .csrf(csrf -> csrf.enable()) // CSRF 보호 활성화 (기본값)
        .authorizeHttpRequests(auth -> auth
            .anyRequest().authenticated())
        .formLogin(withDefaults());
    return http.build();
}

필요에 따라 csrf().disable()을 사용하여 CSRF 보호를 끌 수도 있지만, 보안 취약점이 생길 수 있으므로 주의해야 합니다.

4. AJAX 요청 시 CSRF 처리

JSP 웹 애플리케이션에서 AJAX 요청을 사용할 경우, CSRF 토큰을 요청 헤더에 포함해야 합니다.

var csrfToken = document.querySelector('input[name="_csrf"]').value;

fetch('/process', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-CSRF-TOKEN': csrfToken
    },
    body: JSON.stringify({ username: "user", password: "pass" })
});

이렇게 설정하면 Spring Security가 CSRF 토큰을 검증하여 요청의 신뢰성을 확보할 수 있습니다.

5. CSRF 보호를 고려해야 할 경우

CSRF 보호는 폼 기반 요청을 처리하는 웹 애플리케이션에서는 반드시 활성화하는 것이 좋습니다. REST API를 사용하는 경우에는 JWT 기반 인증 방식으로 CSRF를 비활성화할 수도 있습니다.

Spring Security를 활용하여 JSP 웹 애플리케이션을 개발할 때 CSRF 보호를 올바르게 설정하면 보안을 강화할 수 있습니다.

    (1-1/1)