-- ============================================================================
-- V94 — F-B1 스마트티켓 부정입장 방지: 디바이스 바인딩 + 회전(TOTP) QR 시크릿
-- 담당: kintex-visitor(VIS)·backend · 작성: 2026-07-23
-- ----------------------------------------------------------------------------
-- 목적: 정적 QR(캡처본 재사용 가능) → ①발권 티켓을 특정 디바이스에 바인딩하고
--       ②30초 회전 TOTP 토큰을 발급/검증한다. 캡처 스크린샷은 해당 30초 창(+직전 1창 유예)만
--       유효하므로 양도/재사용을 차단한다.
-- 원칙: 표준 tenant_id='KINTEX'(대문자)·복합 PK 선두. FK 최소화(컬럼만).
--   보안(§0-3): 디바이스 식별자 원문 미보관 — device_hash=sha256(deviceId) 만 저장.
--       회전 시크릿(secret)은 서버 전용(응답·로그 미노출) — 토큰만 클라이언트로 나간다.
--   전부 멱등(IF NOT EXISTS / ON CONFLICT) — 재실행 안전.
-- ============================================================================

CREATE TABLE IF NOT EXISTS ticket_smart_binding (
    tenant_id    varchar(32)  NOT NULL DEFAULT 'KINTEX',
    ticket_code  varchar(48)  NOT NULL,                 -- 발권 티켓(ticket_issue.ticket_code)
    device_hash  varchar(64)  NOT NULL,                 -- sha256(deviceId) — 바인딩 기기
    secret       varchar(64)  NOT NULL,                 -- 회전 TOTP HMAC 시크릿(서버 전용)
    bound_at     timestamptz  NOT NULL DEFAULT now(),
    last_used_at timestamptz,
    CONSTRAINT pk_ticket_smart_binding PRIMARY KEY (tenant_id, ticket_code)
);
CREATE INDEX IF NOT EXISTS ix_ticket_smart_binding_dev ON ticket_smart_binding (tenant_id, device_hash);
