교차 사이트 요청 위조(CSRF) - 보호 미들웨어 누락

Cross-Site Request Forgery (CSRF)

설명

CSRF는 사용자가 로그인된 세션을 악용해, 사용자의 의사와 무관하게 상태 변경 요청(POST/PUT/PATCH/DELETE 등)이 전송되는 취약점입니다. Express에서 쿠키/세션 기반 인증을 쓰면서 CSRF 미들웨어(csurf, lusca.csrf 등)를 적용하지 않으면, 공격자가 사용자를 악성 페이지로 유도해 자동으로 폼 제출이나 AJAX 요청을 발생시켜 계정 변경, 결제, 설정 수정 같은 행위를 사용자의 세션 권한으로 수행하게 만들 수 있습니다.

잠재적 영향

  • 무단 상태 변경: 공격자가 피해자 세션으로 이메일 변경, 비밀번호 변경, 송금 등 중요한 동작을 실행

  • 데이터 무결성/기밀성 훼손: 계정 정보나 설정이 의도치 않게 변경되거나 민감 정보 노출 유발

  • 금전적/업무 피해: 결제 승인, 주문 생성, 권한 변경 등으로 직접적인 비즈니스 손실 발생

  • 법적/신뢰도 저하: 사용자 피해 및 서비스 신뢰 하락, 규제/컴플라이언스 위반 가능

해결 방법

  • CSRF 미들웨어 필수 적용: 쿠키/세션 기반 인증을 사용한다면 전역(app.use) 혹은 라우트별로 csurf 또는 lusca.csrf를 적용

  • 상태 변경 라우트 보호: POST/PUT/PATCH/DELETE 모든 라우트에 빠짐없이 CSRF 검증 추가

  • 토큰 처리: 서버에서 생성한 CSRF 토큰을 폼(hidden input)이나 AJAX 헤더(X-CSRF-Token 등)로 전송하고 서버에서 검증

  • GET은 안전하게: GET 요청으로 상태 변경 금지(멱등·부작용 없음 보장)

  • SameSite=strict/lax 쿠키 설정, Referer/Origin 검증(민감 엔드포인트), 필요 시 CAPTCHA/재인증 적용

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 세션 기반 인증을 사용하면서 CSRF 미들웨어가 없어, 사용자의 브라우저가 자동으로 세션 쿠키를 포함해 악성 사이트가 만든 POST 요청을 전송할 수 있습니다. 결과적으로 공격자가 피해자 권한으로 상태 변경을 수행할 수 있습니다.

  • 안전한 코드: csurf를 전역으로 적용해 서버가 발급한 CSRF 토큰을 검증합니다. 유효한 토큰이 없으면 요청을 거부하므로, 악성 사이트에서 임의로 보낸 요청은 통과하지 못해 무단 상태 변경을 차단합니다.

참조

Last updated