@@ -71,41 +71,42 @@ const verifyBearerTokens = () => {
71
71
* Sentry 웹훅 요청의 시그니처 헤더를 검증합니다.
72
72
* HMAC SHA256과 Sentry의 Client Secret를 사용하여 요청 본문을 해시화하고,
73
73
* Sentry에서 제공하는 시그니처 헤더와 비교하여 요청의 무결성을 확인합니다.
74
- * @param {Request } request - Express 요청 객체
75
- * @returns {boolean } 헤더가 유효하면 true, 그렇지 않으면 false
76
74
*/
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
+ }
101
101
}
102
102
}
103
103
104
104
/**
105
105
* 사용자 인증을 위한 미들웨어 모음
106
106
* @property {Function } verify
107
+ * * @property {Function } verifySignature
107
108
*/
108
109
export const authMiddleware = {
109
110
verify : verifyBearerTokens ( ) ,
110
- verifySignature,
111
+ verifySignature : verifySentrySignature ( ) ,
111
112
} ;
0 commit comments