hyungi
74876b674c
feat(auth): JWT iat + users.password_changed_at invalidation (PR-Docsrv-JWT-Invalidation-1)
PR-Infra-Sec-1H Phase 0 audit 에서 DS jwt invalidation 정책 부재 확정.
password rotation 으로 구 365d JWT (voice-memo-bot 등) invalidate 안 되는
hard gate STOP 진입 → 선행 PR 분리.
- migration 269: users.password_changed_at timestamptz NULL (legacy 호환)
- create_access_token / create_refresh_token: payload 에 iat (int 초) 추가
- verify_password_changed_at helper: int(password_changed_at.timestamp()) > int(iat) 시 401
- get_current_user + refresh_token route: verify helper 호출
- change_password / setup signup / seed_admin INSERT+UPDATE: password_changed_at 갱신
NULL = 검증 skip (migration 직후 운영 영향 0). 첫 password 변경 후만 iat
검증 활성. Sec-1H 의 G-token-old hard gate 통과 path 확보.
2026-05-17 06:20:46 +00:00
..
2026-05-02 16:12:38 +09:00
2026-04-02 13:21:45 +09:00
2026-04-02 14:49:12 +09:00
2026-04-02 15:24:50 +09:00
2026-04-03 09:27:18 +09:00
2026-04-03 10:10:03 +09:00
2026-04-03 10:37:44 +09:00
2026-04-03 13:11:43 +09:00
2026-04-03 13:32:20 +09:00
2026-04-06 07:15:13 +09:00
2026-04-06 07:15:13 +09:00
2026-04-06 12:49:45 +09:00
2026-04-06 13:38:07 +09:00
2026-04-06 14:16:00 +09:00
2026-04-07 13:26:37 +09:00
2026-04-07 08:29:12 +09:00
2026-04-07 14:36:22 +09:00
2026-04-09 07:56:50 +09:00
2026-04-10 09:49:56 +09:00
2026-04-10 08:52:26 +09:00
2026-04-13 14:32:55 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:03:35 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-13 16:02:45 +09:00
2026-04-14 08:36:16 +09:00
2026-04-14 14:55:45 +09:00
2026-04-14 15:31:16 +09:00
2026-04-14 15:31:16 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 08:40:19 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:03:00 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 10:09:25 +09:00
2026-04-15 15:10:01 +09:00
2026-04-16 13:54:15 +09:00
2026-04-16 13:54:15 +09:00
2026-04-16 13:58:58 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-04-17 08:11:06 +09:00
2026-05-02 16:12:38 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-23 15:46:00 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 06:47:36 +09:00
2026-04-24 09:14:56 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 09:38:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:22:40 +09:00
2026-04-24 10:33:32 +09:00
2026-04-24 10:33:32 +09:00
2026-04-24 12:59:39 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 08:18:40 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:08:36 +09:00
2026-04-27 12:38:03 +09:00
2026-04-27 12:38:03 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 07:06:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:00:37 +09:00
2026-04-28 08:41:46 +09:00
2026-04-28 08:41:46 +09:00
2026-04-28 08:54:02 +09:00
2026-04-28 08:54:02 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 09:31:06 +09:00
2026-04-28 13:44:59 +09:00
2026-04-28 13:44:59 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 15:58:35 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-28 16:49:21 +09:00
2026-04-29 08:45:15 +09:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-04-30 01:57:11 +00:00
2026-05-01 07:22:31 +09:00
2026-05-01 07:22:31 +09:00
2026-05-01 00:06:23 +00:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:32:16 +09:00
2026-05-01 09:49:01 +09:00
2026-05-01 11:42:08 +09:00
2026-05-01 11:42:08 +09:00
2026-05-02 07:20:29 +09:00
2026-05-02 07:20:29 +09:00
2026-05-02 07:20:29 +09:00
2026-05-10 14:05:41 +09:00
2026-05-10 14:05:41 +09:00
2026-05-10 14:05:41 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 07:19:04 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:04:21 +09:00
2026-05-11 12:06:41 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 13:04:56 +09:00
2026-05-12 21:47:15 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-12 22:05:06 +00:00
2026-05-16 13:44:15 +09:00
2026-05-16 13:44:15 +09:00
2026-05-17 06:20:46 +00:00