fix: 배포 전 보강 — HMAC 타이밍 안전 비교 + 계좌 업데이트 + 고아 정리
- lib/admin-auth: createHmac 비교를 timingSafeEqual로 교체 (타이밍 공격 방어) - PurchaseAgreementModal: 입금 계좌 케이뱅크 100-116-337157 박재오 - /legal/refund: 구독 서비스 설명에서 삭제된 로또/주식 언급 제거 - app/landing/: 삭제된 서비스 참조만 남은 고아 디렉토리 제거 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,11 @@
|
||||
import { createHmac } from 'crypto';
|
||||
import { createHmac, timingSafeEqual } from 'crypto';
|
||||
|
||||
function safeEqual(a: string, b: string): boolean {
|
||||
const bufA = Buffer.from(a);
|
||||
const bufB = Buffer.from(b);
|
||||
if (bufA.length !== bufB.length) return false;
|
||||
return timingSafeEqual(bufA, bufB);
|
||||
}
|
||||
|
||||
const TOKEN_TTL = 24 * 60 * 60 * 1000; // 24시간
|
||||
|
||||
@@ -17,7 +24,7 @@ export function verifyAdminTokenNode(token: string): boolean {
|
||||
const [encoded, sig] = token.split('.');
|
||||
if (!encoded || !sig) return false;
|
||||
const expected = createHmac('sha256', secret).update(encoded).digest('base64url');
|
||||
if (sig !== expected) return false;
|
||||
if (!safeEqual(sig, expected)) return false;
|
||||
const { exp } = JSON.parse(Buffer.from(encoded, 'base64url').toString());
|
||||
return Date.now() < exp;
|
||||
} catch {
|
||||
@@ -64,7 +71,7 @@ export function verifyPortfolioTokenNode(
|
||||
const [encoded, sig] = token.split('.');
|
||||
if (!encoded || !sig) return null;
|
||||
const expected = createHmac('sha256', secret).update(encoded).digest('base64url');
|
||||
if (sig !== expected) return null;
|
||||
if (!safeEqual(sig, expected)) return null;
|
||||
const payload = JSON.parse(
|
||||
Buffer.from(encoded, 'base64url').toString()
|
||||
) as PortfolioTokenPayload;
|
||||
|
||||
Reference in New Issue
Block a user