@@ -71,41 +71,42 @@ const verifyBearerTokens = () => {
7171 * Sentry 웹훅 요청의 시그니처 헤더를 검증합니다.
7272 * HMAC SHA256과 Sentry의 Client Secret를 사용하여 요청 본문을 해시화하고,
7373 * Sentry에서 제공하는 시그니처 헤더와 비교하여 요청의 무결성을 확인합니다.
74- * @param {Request } request - Express 요청 객체
75- * @returns {boolean } 헤더가 유효하면 true, 그렇지 않으면 false
7674 */
77- function verifySignature ( request : Request , res : Response , next : NextFunction ) {
78- try {
79- if ( ! process . env . SENTRY_CLIENT_SECRET ) throw new Error ( "SENTRY_CLIENT_SECRET가 env에 없습니다" ) ;
80-
81- const hmac = crypto . createHmac ( "sha256" , process . env . SENTRY_CLIENT_SECRET ) ;
82-
83- // Raw body 사용 - Express에서 파싱되기 전의 원본 데이터 필요
84- // request.rawBody가 없다면 fallback으로 JSON.stringify 사용 (완벽하지 않음)
85- // @ts -expect-error - rawBody는 커스텀 미들웨어에서 추가되는 속성
86- const bodyToVerify = request . rawBody || JSON . stringify ( request . body ) ;
87- const sentrySignature = request . headers [ "sentry-hook-signature" ] ;
88-
89- if ( ! bodyToVerify ) throw new Error ( "요청 본문이 없습니다." ) ;
90- if ( ! sentrySignature ) throw new Error ( "시그니처 헤더가 없습니다." ) ;
91-
92- hmac . update ( bodyToVerify , "utf8" ) ;
93- const digest = hmac . digest ( "hex" ) ;
94-
95- if ( digest !== sentrySignature ) throw new CustomError ( "유효하지 않은 시그니처 헤더입니다." , "INVALID_SIGNATURE" , 400 ) ;
96-
97- next ( ) ;
98- } catch ( error ) {
99- logger . error ( '시그니처 검증 중 오류가 발생하였습니다. : ' , error ) ;
100- next ( error ) ;
75+ function verifySentrySignature ( ) {
76+ return ( req : Request , res : Response , next : NextFunction ) => {
77+ try {
78+ if ( ! process . env . SENTRY_CLIENT_SECRET ) throw new Error ( "SENTRY_CLIENT_SECRET가 env에 없습니다" ) ;
79+
80+ const hmac = crypto . createHmac ( "sha256" , process . env . SENTRY_CLIENT_SECRET ) ;
81+
82+ // Raw body 사용 - Express에서 파싱되기 전의 원본 데이터 필요
83+ // req.rawBody가 없다면 fallback으로 JSON.stringify 사용 (완벽하지 않음)
84+ // @ts -expect-error - rawBody는 커스텀 미들웨어에서 추가되는 속성
85+ const bodyToVerify = req . rawBody || JSON . stringify ( req . body ) ;
86+ const sentrySignature = req . headers [ "sentry-hook-signature" ] ;
87+
88+ if ( ! bodyToVerify ) throw new Error ( "요청 본문이 없습니다." ) ;
89+ if ( ! sentrySignature ) throw new Error ( "시그니처 헤더가 없습니다." ) ;
90+
91+ hmac . update ( bodyToVerify , "utf8" ) ;
92+ const digest = hmac . digest ( "hex" ) ;
93+
94+ if ( digest !== sentrySignature ) throw new CustomError ( "유효하지 않은 시그니처 헤더입니다." , "INVALID_SIGNATURE" , 400 ) ;
95+
96+ next ( ) ;
97+ } catch ( error ) {
98+ logger . error ( '시그니처 검증 중 오류가 발생하였습니다. : ' , error ) ;
99+ next ( error ) ;
100+ }
101101 }
102102}
103103
104104/**
105105 * 사용자 인증을 위한 미들웨어 모음
106106 * @property {Function } verify
107+ * * @property {Function } verifySignature
107108 */
108109export const authMiddleware = {
109110 verify : verifyBearerTokens ( ) ,
110- verifySignature,
111+ verifySignature : verifySentrySignature ( ) ,
111112} ;
0 commit comments