설명
Express에서 미들웨어 경로를 RegExp로 정의하면 기본이 대소문자 구분(case-sensitive)입니다. 보안 미들웨어의 정규식은 대소문자를 구분하지만 실제 라우트는 구분하지 않으면, 같은 엔드포인트의 대소문자만 바꿔 미들웨어를 우회할 수 있습니다. 예를 들어 /admin 으로 보호했지만 /Admin, /AdMiN 등은 매칭되지 않아 보호가 빠집니다.
잠재적 영향
- 인증/인가 우회: 관리 페이지나 보호된 API에 경로의 대소문자만 바꿔 접근할 수 있습니다.
- 로깅/감사 누락: 로깅/모니터링 미들웨어가 일부 케이스에서 실행되지 않아 추적이 어려워집니다.
- 보안 정책 불일치: 요청 횟수 제한, CSRF 보호, 보안 헤더(CSP/HSTS 등) 적용 미들웨어를 건너뛰어 취약한 응답이 노출될 수 있습니다.
- 접근 제어 오해: 운영자가 동일한 경로라고 생각하지만, 실제로는 서로 다른 경로로 취급되어 규칙이 분리·무력화됩니다.
해결 방법
- 실제 라우트가 대소문자를 구분하지 않는다면 보안 미들웨어의 RegExp 경로에도 'i' 플래그를 사용하세요. 예: /^/admin(?:/|$)/i 또는 new RegExp('^/admin(?:/|$)','i').
- 가능하면 문자열 경로를 사용하여 Express의 기본 대소문자 비민감 매칭과 일관되게 유지하세요. 예: app.use('/admin', authMiddleware).
- 프레임워크 설정을 점검하세요: app.set('case sensitive routing', false)가 기본이며, 정규식과 문자열 경로를 함께 쓸 때 동작 차이를 문서화하고 점검하세요.
- 보안 미들웨어는 가능한 전역 적용 후 세부 경로를 제한적으로 열어주는 방식(allowlist)으로 구성하세요.
- 경로 케이스 변형에 대한 테스트(예: /admin, /Admin, /AdMiN)를 추가하여 우회가 없는지 검증하세요.
예시
변경 전
javascript
const express = require("express");
const app = express();
function requireAdmin(req, res, next) {
if (!req.user || !req.user.isAdmin) return res.sendStatus(403);
next();
}
// BAD: 정규식에 'i' 플래그가 없어 case-sensitive 매칭
app.use(/^\/admin\/api\/.*$/, requireAdmin);
app.get("/admin/api/users", (req, res) => {
res.send("users");
});
// 예: GET /Admin/api/users 요청은 requireAdmin을 통과하지 않아 우회됨
변경 후
javascript
const express = require("express");
const app = express();
function requireAdmin(req, res, next) {
if (!req.user || !req.user.isAdmin) return res.sendStatus(403);
next();
}
// 옵션 1) 문자열 경로 사용: 기본적으로 case-insensitive
app.use("/admin", requireAdmin);
// 옵션 2) 정규식을 꼭 써야 한다면 'i' 플래그 추가
// app.use(/^\/admin(?:\/|$)/i, requireAdmin);
app.get("/admin/api/users", (req, res) => {
res.send("users");
});
설명:
- 변경 전: RegExp 경로에 'i' 플래그가 없어 대소문자를 구분합니다. 따라서 '/admin/...' 는 보호되지만, '/Admin/...' 같은 케이스는 매칭되지 않아 인증/인가 미들웨어가 실행되지 않습니다. Express의 문자열 경로와 달리 RegExp는 기본이 case-sensitive라는 차이로 인해 우회가 발생합니다.
- 변경 후: 문자열 경로를 사용해 Express의 기본 대소문자 비민감 매칭을 활용하거나, 정규식 사용 시 'i' 플래그를 추가해 대소문자에 상관없이 동일하게 매칭되도록 했습니다. 이렇게 하면 경로의 케이스 변형으로 보안 미들웨어를 우회할 수 없습니다.