보안

크로스 사이트 요청 위조 (Cross-Site Request Forgery, CSRF)

타우루스 2025. 9. 3. 18:00

오늘은 웹 애플리케이션 보안에서 중요한 개념 중 하나인 크로스 사이트 요청 위조 (Cross-Site Request Forgery, CSRF) 에 대해 설명해 드리겠습니다. CSRF는 공격자가 사용자의 신뢰를 이용하여 웹 사이트에서 원치 않는 작업을 실행하도록 만드는 공격 기법입니다.
 

1. CSRF는 무엇인가요?

CSRF는 웹 애플리케이션의 취약점을 이용하여 사용자가 의도하지 않은 요청을 보내도록 만드는 공격입니다. 마치 사용자가 직접 요청을 보낸 것처럼 위장하여, 사용자의 권한으로 특정 작업을 수행하는 것이죠.

2. CSRF 공격의 작동 원리

CSRF 공격은 다음과 같은 단계로 진행됩니다.

  1. 사용자 로그인 (Victim Logs In): 사용자가 정상적인 웹 사이트 (예: 은행 웹 사이트)에 로그인합니다. 이때 사용자의 세션 정보가 쿠키에 저장되어 브라우저에 유지됩니다.
  2. 악성 사이트 방문 (Victim Visits Malicious Site): 공격자는 악의적인 웹 페이지 (또는 이메일)를 만들고, 사용자가 이 페이지를 방문하도록 유도합니다. 이 악성 페이지에는 공격 대상 웹 사이트로 위조된 요청을 보내는 코드가 숨겨져 있습니다.
  3. 위조된 요청 전송 (Forged Request Sent): 사용자가 악성 페이지를 방문하면, 악성 코드에 의해 공격 대상 웹 사이트로 위조된 요청이 자동으로 전송됩니다. 이때 브라우저는 사용자의 세션 쿠키를 함께 보내게 됩니다.
  4. 서버에서 요청 처리 (Server Processes Request): 공격 대상 웹 사이트의 서버는 이 요청을 정상적인 사용자의 요청으로 인식하고 처리합니다. 이는 사용자가 의도하지 않은 행동 (예: 비밀번호 변경, 송금 등)으로 이어질 수 있습니다.
 

3. CSRF 방어 방법

CSRF 공격을 방어하는 가장 일반적이고 효과적인 방법은 CSRF 토큰 (CSRF Token) 을 사용하는 것입니다.
 
CSRF 토큰 방식 (Double Submit Cookie Pattern):

  1. 토큰 생성 및 전송 (Token Generation and Transmission): 서버는 사용자가 웹 페이지를 요청할 때마다 고유한 CSRF 토큰을 생성합니다. 이 토큰은 두 가지 방식으로 사용자에게 전달됩니다.
    • 쿠키에 저장 (Stored in Cookie): 토큰은 암호화되거나 무작위 문자열 형태로 사용자 브라우저의 쿠키에 저장됩니다.
    • HTML 폼에 포함 (Included in HTML Form): 동일한 토큰이 HTML 폼의 숨겨진 필드 (hidden field) 에도 포함되어 전송됩니다.
  2. 요청 시 토큰 전송 (Token Transmission with Request): 사용자가 폼을 제출하여 특정 작업을 수행하는 요청을 보낼 때, 브라우저는 쿠키에 저장된 토큰과 폼에 포함된 토큰을 함께 서버로 전송합니다.
  3. 서버 측 검증 (Server-Side Validation): 서버는 요청을 받으면, 쿠키에서 추출한 토큰과 폼에서 추출한 토큰을 비교합니다.
    • 토큰 일치 (Tokens Match): 두 토큰이 일치하면, 해당 요청은 정상적인 사용자가 보낸 것으로 판단하고 작업을 처리합니다.
    • 토큰 불일치 (Tokens Mismatch): 두 토큰이 일치하지 않으면, 해당 요청은 CSRF 공격으로 간주하고 작업을 거부합니다.
  4. 사용자 재인증 (User Re-authentication)
    • 작동 원리: 비밀번호 변경, 계정 삭제, 중요 정보 열람 등 매우 민감한 작업을 수행하기 전에 사용자에게 다시 한 번 비밀번호를 입력하도록 요구하여 본인임을 확인하는 방식입니다.
    • 장점: 공격자가 사용자의 비밀번호를 알지 못하는 한, 가장 민감한 작업에 대한 CSRF 공격을 효과적으로 방어할 수 있습니다. 매우 높은 수준의 보안을 제공합니다.
    • 단점: 사용자에게 번거로움을 줄 수 있어 사용자 경험을 저해할 수 있습니다. 모든 작업에 적용하기는 현실적으로 어렵습니다.
    • 권장 사항: 보안상 매우 중요한 소수의 작업에 한해 선택적으로 적용하는 것이 좋습니다.

왜 이 방법이 효과적인가요? 공격자가 위조된 요청을 보낼 수는 있지만, 브라우저의 Same-Origin Policy (동일 출처 정책) 덕분에 악성 웹 페이지는 공격 대상 웹 사이트의 쿠키에 직접 접근할 수 없습니다. 따라서 공격자는 폼에 숨겨진 CSRF 토큰 값을 알 수 없으므로, 위조된 요청에는 유효한 CSRF 토큰이 포함될 수 없습니다.
 

 

4. CSRF 공격의 특징 및 왜 위험한가요?

CSRF 공격은 다음과 같은 특징 때문에 위험합니다:

  • 사용자 신뢰 악용 (Exploits User Trust): 공격자는 사용자가 특정 웹 사이트에 대해 가지고 있는 신뢰를 악용합니다. 사용자는 자신이 신뢰하는 사이트에 로그인한 상태이기 때문에, 자신도 모르게 위험한 요청을 보낼 수 있다는 것을 인지하기 어렵습니다.
  • 세션 유지 상태 악용 (Leverages Persistent Sessions): 사용자가 웹 사이트에 로그인한 상태 (세션이 유지된 상태) 에서만 공격이 가능합니다. 세션 쿠키가 요청과 함께 자동으로 전송되기 때문입니다.
  • 공격자가 직접 응답을 받지 않음 (Attacker Does Not Receive Response): 공격자는 위조된 요청에 대한 서버의 응답을 직접 받지 못합니다. 따라서 공격 성공 여부를 즉시 알기 어렵지만, 이미 서버에서는 사용자의 권한으로 원치 않는 작업을 수행했을 수 있습니다.
  • 다양한 형태의 공격 (Various Forms of Attack): CSRF 공격은 악성 웹 페이지의 <img src="...">, <script src="...">, <form action="..."> 등 다양한 HTML 요소를 통해 발생할 수 있습니다. 심지어 이메일에 이미지를 포함하는 방식으로도 공격이 가능합니다.

 

5. CSRF 요약 및 핵심 정리

지금까지 크로스 사이트 요청 위조(CSRF) 공격의 원리부터 다양한 방어 기법까지 자세히 살펴보았습니다. 마지막으로 핵심 사항들을 요약해 드리겠습니다.

  • CSRF는 사용자의 의지와 무관하게 공격자가 원하는 요청을 서버로 전송하게 만드는 공격입니다. 이는 사용자가 특정 웹사이트에 로그인된 상태, 즉 인증된 세션을 가지고 있을 때 발생합니다.
  • 공격의 핵심은 브라우저가 요청 시 자동으로 쿠키(세션 정보)를 포함하여 전송하는 특징을 악용하는 것입니다. 공격자는 이 점을 이용하여 사용자가 마치 직접 요청한 것처럼 서버를 속입니다.
  • 가장 강력하고 표준적인 방어책은 'CSRF 토큰'을 사용하는 것입니다. 서버에서 발급한 예측 불가능한 토큰을 요청에 포함시켜, 해당 요청이 정상적인 경로를 통해 온 것임을 증명하는 방식입니다.
  • 'SameSite 쿠키 속성'을 설정하는 것은 CSRF 토큰을 보완하는 훌륭한 2차 방어선입니다. 최신 브라우저에서는 이 속성만으로도 대부분의 CSRF 공격을 효과적으로 막을 수 있습니다.
  • Referer 헤더 검증이나 중요 작업 전 재인증은 보조적인 수단으로 활용될 수 있지만, 단독으로 사용하기에는 한계가 있습니다.

결론적으로, 안전한 웹 애플리케이션을 구축하기 위해서는 개발 초기 단계부터 CSRF 공격에 대한 방어 로직을 반드시 고려해야 합니다. 대부분의 최신 웹 프레임워크는 CSRF 방어 기능을 내장하고 있으므로, 이를 적극적으로 활용하는 것이 중요합니다.

'보안' 카테고리의 다른 글

OAuth(Open Authorization)  (0) 2026.02.22
IPSec  (0) 2025.09.20
크로스사이트 스크립팅 - Cross Site Scripting(XSS)  (0) 2025.09.02
SQL 인젝션 (Injection)  (0) 2025.09.02
Pharming  (1) 2025.09.02