-- Replay-Schutz fuer Refresh-Tokens (Pentest R164-02). -- -- Die bisherige Rotation bot keinen Replay-Schutz: der alte Token blieb bis exp -- gueltig (7 Tage), ein gestohlener Token war also parallel zum legitimen -- nutzbar. Jetzt traegt jeder Refresh-Token eine jti und gehoert zu einer -- Sitzungsfamilie; beim Einloesen wird die jti verbraucht. Taucht sie erneut -- auf, wird die gesamte Familie widerrufen und der Vorfall gemeldet. CREATE TABLE IF NOT EXISTS `RefreshTokenRecord` ( `id` INT NOT NULL AUTO_INCREMENT, `jti` VARCHAR(191) NOT NULL, `familyId` VARCHAR(191) NOT NULL, `userId` INT NULL, `customerId` INT NULL, `isCustomerPortal` TINYINT(1) NOT NULL DEFAULT 0, `issuedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `expiresAt` DATETIME(3) NOT NULL, `usedAt` DATETIME(3) NULL, `replacedByJti` VARCHAR(191) NULL, `reuseCount` INT NOT NULL DEFAULT 0, `revokedAt` DATETIME(3) NULL, `revokedReason` VARCHAR(191) NULL, PRIMARY KEY (`id`), UNIQUE KEY `RefreshTokenRecord_jti_key` (`jti`), KEY `RefreshTokenRecord_familyId_idx` (`familyId`), KEY `RefreshTokenRecord_expiresAt_idx` (`expiresAt`), KEY `RefreshTokenRecord_userId_idx` (`userId`), KEY `RefreshTokenRecord_customerId_idx` (`customerId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;