크로스사이트 요청 위조 (CSRF)

Cross-Site Request Forgery (CSRF)

설명

CSRF(Cross-Site Request Forgery)는 사용자가 인증된 세션을 가지고 있을 때, 공격자가 사용자를 속여 의도하지 않은 요청을 전송하게 만드는 취약점입니다. Express에서 CSRF 방어 미들웨어(express.csrf())를 methodOverride 미들웨어 보다 먼저 적용하면, GET 요청이 CSRF 방어를 우회하여 POST, PUT 등 다른 HTTP 메소드로 변환될 수 있습니다. 이로 인해 CSRF 방어가 효과적으로 작동하지 않아 공격자가 임의의 상태 변경 요청을 할 수 있습니다.

잠재적 영향

  • 세션 탈취 및 악의적 요청(세션 도용 및 악의적 데이터 변경): 공격자가 사용자의 권한을 도용하여 중요한 정보를 변경하거나 부적절한 행동을 수행할 수 있음

  • 비인가 상태 변조(무단 설정/데이터 변경): 사용자의 의도와 무관하게 중요한 데이터나 설정이 조작될 위험이 높음

해결 방법

  • express.methodOverride()를 반드시 express.csrf() 미들웨어보다 먼저 설정하세요.

  • 미들웨어 순서를 꼼꼼히 확인해 CSRF 방어가 모든 HTTP 요청에 대해 정상적으로 동작하도록 하세요.

  • 추가적으로 중요한 상태 변경 요청에는 CSRF 토큰을 엄격하게 검증하세요.

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

취약한 코드

const express = require('express');
const app = express();

app.use(express.csrf()); // ❌ CSRF 미들웨어가 먼저 사용됨
app.use(express.methodOverride());

app.post('/update', function(req, res) {
  // 중요 데이터 처리 코드
  res.send('done');
});

안전한 코드

설명:

  • 취약한 코드: CSRF 방어 미들웨어를 methodOverride 미들웨어보다 먼저 적용하면, GET 요청 등이 methodOverride에 의해 POST 등으로 변환되어 CSRF 검증이 제대로 되지 않습니다.

  • 안전한 코드: methodOverride 미들웨어를 먼저 적용하고 그 뒤에 CSRF 미들웨어를 적용하면, 모든 변환된 HTTP 메소드 요청에 CSRF 방어가 정상적으로 동작하여 우회 공격을 방지할 수 있습니다.

참조

Last updated