Skip to content
Prev Previous commit
refactor: 린팅 이슈 해결 및 통일성 강조
  • Loading branch information
six-standard committed Jul 6, 2025
commit 3ba614988367a01e954114b0468539cfaea0a381
55 changes: 28 additions & 27 deletions src/middlewares/auth.middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,41 +71,42 @@ const verifyBearerTokens = () => {
* Sentry 웹훅 요청의 시그니처 헤더를 검증합니다.
* HMAC SHA256과 Sentry의 Client Secret를 사용하여 요청 본문을 해시화하고,
* Sentry에서 제공하는 시그니처 헤더와 비교하여 요청의 무결성을 확인합니다.
* @param {Request} request - Express 요청 객체
* @returns {boolean} 헤더가 유효하면 true, 그렇지 않으면 false
*/
function verifySignature(request: Request, res: Response, next: NextFunction) {
try {
if(!process.env.SENTRY_CLIENT_SECRET) throw new Error("SENTRY_CLIENT_SECRET가 env에 없습니다");

const hmac = crypto.createHmac("sha256", process.env.SENTRY_CLIENT_SECRET);

// Raw body 사용 - Express에서 파싱되기 전의 원본 데이터 필요
// request.rawBody가 없다면 fallback으로 JSON.stringify 사용 (완벽하지 않음)
// @ts-expect-error - rawBody는 커스텀 미들웨어에서 추가되는 속성
const bodyToVerify = request.rawBody || JSON.stringify(request.body);
const sentrySignature = request.headers["sentry-hook-signature"];

if (!bodyToVerify) throw new Error("요청 본문이 없습니다.");
if(!sentrySignature) throw new Error("시그니처 헤더가 없습니다.");

hmac.update(bodyToVerify, "utf8");
const digest = hmac.digest("hex");

if(digest !== sentrySignature) throw new CustomError("유효하지 않은 시그니처 헤더입니다.", "INVALID_SIGNATURE", 400);

next();
} catch (error) {
logger.error('시그니처 검증 중 오류가 발생하였습니다. : ', error);
next(error);
function verifySentrySignature() {
return (req: Request, res: Response, next: NextFunction) => {
try {
if (!process.env.SENTRY_CLIENT_SECRET) throw new Error("SENTRY_CLIENT_SECRET가 env에 없습니다");

const hmac = crypto.createHmac("sha256", process.env.SENTRY_CLIENT_SECRET);

// Raw body 사용 - Express에서 파싱되기 전의 원본 데이터 필요
// req.rawBody가 없다면 fallback으로 JSON.stringify 사용 (완벽하지 않음)
// @ts-expect-error - rawBody는 커스텀 미들웨어에서 추가되는 속성
const bodyToVerify = req.rawBody || JSON.stringify(req.body);
const sentrySignature = req.headers["sentry-hook-signature"];

if (!bodyToVerify) throw new Error("요청 본문이 없습니다.");
if (!sentrySignature) throw new Error("시그니처 헤더가 없습니다.");

hmac.update(bodyToVerify, "utf8");
const digest = hmac.digest("hex");

if (digest !== sentrySignature) throw new CustomError("유효하지 않은 시그니처 헤더입니다.", "INVALID_SIGNATURE", 400);

next();
} catch (error) {
logger.error('시그니처 검증 중 오류가 발생하였습니다. : ', error);
next(error);
}
}
}

/**
* 사용자 인증을 위한 미들웨어 모음
* @property {Function} verify
* * @property {Function} verifySignature
*/
export const authMiddleware = {
verify: verifyBearerTokens(),
verifySignature,
verifySignature: verifySentrySignature(),
};
Loading