<!-- 사용자가 페이지를 로드하면, 자동으로 폼이 전송되어 자금 이체 요청을 만듭니다 -->
<form action="https://mybank.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="toAccount" value="attacker-account">
<input type="submit" style="display: none;">
</form>
<script> document.forms[0].submit(); // 폼을 자동 제출하여 request 실행 </script>
HTML 코드는 CSRF(Cross-Site Request Forgery) 공격의 예시입니다. CSRF 공격은 사용자가 인증된 세션을 유지한 상태에서 특정 사이트를 방문하게 하여, 악의적인 요청을 사용자의 계정으로 전송하게 만드는 공격 기법입니다. 예를 들어, 사용자가 이미 mybank.com에 로그인된 상태에서 해당 코드를 포함하는 페이지를 로드하면, 자동으로 자금 이체 요청이 실행됩니다.
설명:
- 자동 폼 전송: <script> document.forms[0].submit(); </script>로 폼이 자동 전송되도록 설정하여 사용자가 의도하지 않은 자금 이체 요청이 수행됩니다.
- 자동 쿠키 전송: www.xxx.com을 통해 자동으로 쿠키가 첨부되어 세션이 유지된 상태로 요청이 전달됩니다.
방지 방법:
- CSRF 토큰 사용: 서버는 폼과 함께 고유한 토큰을 발급하여, 요청 시 해당 토큰을 포함하게 합니다. 서버는 요청에서 토큰을 확인하고 유효한 경우에만 처리합니다.
- SameSite 쿠키 설정: 쿠키의 SameSite 속성을 Strict나 Lax로 설정하여, 외부 사이트에서 쿠키가 자동으로 전송되지 않게 합니다.
- CAPTCHA 추가: 자동화된 요청을 막기 위해 사용자 확인 단계(CAPTCHA)를 추가하여 폼 전송 전 사용자의 액션을 요구합니다.
- 참조자 헤더 검사: 요청의 Referer 헤더를 확인하여 예상된 출처에서 온 요청만 처리하는 방식입니다.
이러한 보안 조치를 통해, 사용자의 권한을 도용한 악의적인 요청을 차단할 수 있습니다. CSRF 방지는 특히 금융 서비스에서 필수적인 보안 요소입니다.
CSRF(Cross-Site Request Forgery)는 악의적인 사이트가 사용자의 권한을 도용해 사용자의 세션을 통해 원하지 않는 요청을 서버에 보내게 만드는 공격 방식입니다. CSRF 공격은 사용자가 로그인된 상태로 외부 사이트를 방문할 때 발생하며, 예기치 않은 데이터 변경, 금전 거래 등이 이루어질 수 있어 매우 위험합니다.
CSRF 공격 방지 방법
CSRF 공격을 방지하기 위해 여러 보안 방법이 존재하며, 다음과 같은 주요 방식들이 사용됩니다.
1. CSRF 토큰(Token) 사용
CSRF 보호를 위한 가장 널리 쓰이는 방법으로, 서버는 폼 요청에 고유한 토큰을 발급해 폼과 함께 전송하도록 합니다.
- 서버에서 토큰 생성: 서버는 사용자의 세션에 종속된 고유 토큰을 생성하여 클라이언트에 전달합니다.
- 클라이언트에서 토큰 전송: 클라이언트는 요청 시 해당 토큰을 요청 헤더나 폼에 포함하여 함께 전송합니다.
- 토큰 유효성 검사: 서버는 받은 요청의 토큰이 유효한지 확인하고, 일치하지 않을 경우 요청을 거부합니다.
예: Spring Security는 CSRF 토큰 생성을 기본 제공하며, 자동으로 HTTP POST 요청에 대해 CSRF 토큰 검사를 진행합니다.
2. SameSite 쿠키 속성 설정
쿠키의 SameSite 속성을 통해 외부 사이트에서의 쿠키 전송을 제한할 수 있습니다.
- Strict 모드: 외부 사이트의 모든 요청에 대해 쿠키가 전송되지 않도록 설정합니다.
- Lax 모드: GET 요청과 같은 안전한 요청에는 쿠키 전송을 허용하지만, POST와 같은 위험한 요청에서는 쿠키 전송을 막습니다.
이 설정을 통해 CSRF 공격에서 쿠키가 포함된 요청이 타 사이트에서 전송되지 않도록 제한할 수 있습니다.
3. 참조자(Referer) 검사
서버는 HTTP 요청의 Referer 헤더를 확인하여 예상되는 출처에서 온 요청만 처리하는 방식입니다.
- CSRF 공격은 주로 다른 도메인에서 시작되므로, 요청의 Referer 헤더가 신뢰할 수 있는 도메인인지 확인하여 공격을 방지할 수 있습니다.
- 그러나 일부 상황에서는 Referer 헤더가 누락될 수 있기 때문에, 보조적인 보호책으로 활용됩니다.
4. 사용자 확인(CAPTCHA)
자동화된 요청을 막기 위해 사용자 액션을 요구하는 방식으로, CSRF 공격을 예방할 수 있습니다.
- 사용자가 폼을 제출할 때 CAPTCHA를 추가하여 사용자가 직접 요청하는지 확인하는 방식입니다.
5. HTTP 메서드 제한
CSRF 공격은 주로 데이터 조작을 위한 POST, PUT, DELETE 메서드를 활용합니다.
- 중요한 데이터 변경 요청에 대해서만 보호를 설정하고, 안전한 GET 요청을 제한적으로 허용하여 공격 범위를 줄일 수 있습니다.
예시: Spring Security에서 CSRF 보호 활성화
Spring Security는 기본적으로 CSRF 토큰을 적용하며, 다음과 같이 CSRF 보호를 설정할 수 있습니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) // CSRF 토큰을 쿠키에 저장
.and()
.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated();
}
}
요약
CSRF 공격 방지는 사용자가 원하지 않는 요청이 전송되는 것을 막기 위한 중요한 보안 요소입니다. 이를 위해 토큰 발급, SameSite 쿠키 설정, 참조자 검사, CAPTCHA 등을 활용하여 CSRF 공격으로부터 보호할 수 있습니다.
'Springboot Study > Springboot Security' 카테고리의 다른 글
JWT (JSON Web Token) (0) | 2024.11.01 |
---|---|
CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유) (0) | 2024.11.01 |
Filter (FilterChain) (0) | 2024.10.31 |
Spring Security에서 중요한 인터페이스들 (0) | 2024.10.30 |
스레드풀 (0) | 2024.10.29 |