CSRF(Cross-Site Request Forgery)은 웹 애플리케이션의 취약점을 악용하여 사용자가 의도하지 않은 행동을 하도록 유도하는 공격입니다. 공격자가 사용자의 권한을 훔쳐 요청을 보내기 때문에 특히 인증된 사용자 세션이 있는 경우 심각한 피해를 입을 수 있습니다. CSRF는 서버가 사용자가 요청을 직접 보냈는지 확인하지 않는 경우에 발생할 수 있습니다.
CSRF 작동 원리
1. 사용자 인증: 사용자가 사이트에 로그인하면 서버는 세션 ID나 인증 토큰을 발급하여 브라우저에 저장합니다. 이 세션 ID나 토큰을 통해 사용자는 로그인된 상태로 서버에 요청을 보낼 수 있습니다.
2. 악성 사이트 방문: 공격자는 사용자가 로그인된 상태에서 특정 악성 사이트를 방문하거나, 이메일/메시지를 통해 악성 링크를 클릭하도록 유도합니다.
3. 자동 요청: 사용자가 악성 사이트에 접속하거나 특정 URL을 클릭하게 되면 해당 사이트는 사용자가 로그인된 세션을 이용해 서버에 요청을 보냅니다. 예를 들어, 은행 사이트에 로그인한 상태에서 악성 사이트가 사용자의 계좌에서 다른 계좌로 이체 요청을 보내는 식입니다.
4. 서버 요청 처리: 서버는 사용자가 직접 요청을 보낸 것인지 확인하지 않으면 사용자의 세션 ID나 토큰을 통해 요청을 정상적으로 처리해버리며, 사용자는 알지 못하는 사이에 자산이나 정보가 유출될 수 있습니다.
CSRF 방어 기법
CSRF 공격을 방지하기 위해 다양한 방법이 사용됩니다:
1. CSRF 토큰 사용: 가장 널리 사용되는 방어 방법으로, 서버는 사용자가 요청을 보낼 때마다 고유한 CSRF 토큰을 생성하여 사용자가 보낸 요청에 포함하도록 요구합니다. 서버는 해당 토큰이 유효한지 확인함으로써 요청의 정당성을 검증합니다.
• 예를 들어, 사용자가 요청을 보낼 때 서버는 미리 생성된 토큰을 숨겨진 필드에 포함해 전송하고, 서버는 이 토큰이 맞는지 확인하여 요청을 처리합니다.
2. Referer Header 검증: 서버가 요청의 Referer 헤더를 확인하여 요청이 적절한 출처에서 온 것인지 검증합니다. 하지만 Referer 헤더는 사용자나 네트워크에 의해 쉽게 제거될 수 있어 완전한 방어는 아닙니다.
3. SameSite Cookie 속성 설정: SameSite 쿠키 속성은 브라우저가 다른 출처에서 요청이 오더라도 인증 세션 쿠키를 자동으로 전송하지 않도록 제한합니다. 이 방식은 CSRF 방지에 효과적이지만 브라우저 호환성이 문제일 수 있습니다.
4. 캡차(CAPTCHA): 사용자 요청 시 CAPTCHA를 요구하여 실제 사용자가 요청을 보낸 것임을 확인하는 방법입니다. 다만 사용성에 영향을 줄 수 있기 때문에 모든 요청에 적용되지는 않습니다.
CSRF 토큰 적용 예시
Spring Security에서는 CSRF 토큰을 자동으로 생성하고 적용합니다. 사용자는 로그인 시 서버로부터 CSRF 토큰을 받아 이후 모든 요청에 이 토큰을 포함하게 됩니다. 서버는 해당 토큰을 통해 요청의 정당성을 판단합니다.
http
.csrf(csrf -> csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
)
.authorizeRequests(authorize -> authorize
.anyRequest().authenticated()
);
위 설정을 통해 CSRF 토큰이 자동으로 생성되며 쿠키와 함께 전송됩니다. 이 방식은 브라우저가 토큰을 전송하므로, 서버는 요청이 정당한 출처에서 왔는지 쉽게 확인할 수 있습니다.
CSRF와 XSS의 차이
CSRF는 사용자의 세션을 이용해 다른 사이트에서 서버로 유효한 요청을 보내는 데 비해, XSS(Cross-Site Scripting)는 악성 스크립트를 삽입하여 사용자의 브라우저에서 직접 실행합니다. CSRF가 서버로 전송되는 요청을 대상으로 한다면, XSS는 클라이언트 브라우저 내에서 악성 코드 실행에 집중합니다.
CSRF 방지의 중요성
CSRF 공격은 사용자가 자신의 계정에서 무단 요청을 보내게 하여 자산이나 개인 정보를 손쉽게 탈취할 수 있게 합니다. 특히 금융 서비스나 민감한 정보가 오가는 웹 애플리케이션에서는 CSRF 방지가 필수적이며, 보안 토큰 및 세션 관리를 철저히 해야 합니다.
CSRF는 기본적인 웹 보안 원칙을 이해하고 적용함으로써 방어할 수 있습니다.
'Spring Security' 카테고리의 다른 글
requestMatcher (0) | 2024.10.30 |
---|---|
hasAuthority와 그 외의 다양한 표현식 (0) | 2024.10.30 |
@Async (0) | 2024.10.29 |
DelegatingSecurityContextCallable (0) | 2024.10.29 |
Callable과 Runnable (0) | 2024.10.29 |