┌─────────────────────────────────────────────────────────────────────────────────────────────┐ │ Auth Flow — Incident Notes 2026-04-12 │ └─────────────────────────────────────────────────────────────────────────────────────────────┘ ┌─────────┐ ┌─────────────┐ ┌──────────────┐ ┌──────────┐ ┌─────────┐ │ Browser │ │ API Gateway │ │ Auth Service │ │ Postgres │ │ Redis │ └────┬────┘ └──────┬──────┘ └──────┬───────┘ │(user db) │ │(session)│ │ │ │ └─────┬────┘ └────┬────┘ │ │ │ │ │ ══════╪═══════════════════╪════════════════════╪═══════════════════╪═══════════════╪══════════ LOGIN SUCCESS FLOW │ │ │ │ ══════╪═══════════════════╪════════════════════╪═══════════════════╪═══════════════╪══════════ │ │ │ │ │ │ POST /login │ │ │ │ │ {email, password}│ │ │ │ │──────────────────>│ │ │ │ │ │ forward creds │ │ │ │ │───────────────────>│ │ │ │ │ │ │ │ │ │ │ SELECT user │ │ │ │ │ WHERE email=? │ │ │ │ │──────────────────>│ │ │ │ │ │ │ │ │ │ user record │ │ │ │ │ (hashed pw) │ │ │ │ │<──────────────────│ │ │ │ │ │ │ │ │ │───┐ │ │ │ │ │ │ bcrypt verify │ │ │ │ │<──┘ ✓ valid │ │ │ │ │ │ │ │ │ │ SET session:{uid}│ │ │ │ │ TTL 7d │ │ │ │ │─────────────────────────────────> │ │ │ │ │ OK │ │ │ │<─────────────────────────────────│ │ │ │ │ │ │ │ │───┐ │ │ │ │ │ │ sign JWT │ │ │ │ │<──┘ (exp: 15min) │ │ │ │ │ │ │ │ │ 200 OK │ │ │ │ │ {access_token, │ │ │ │ │ refresh_token} │ │ │ │ │<───────────────────│ │ │ │ │ │ │ │ │ 200 OK │ │ │ │ │ {access_token, │ │ │ │ │ refresh_token} │ │ │ │ │<──────────────────│ │ │ │ │ │ │ │ │ │ ┌──────────────────────────────────┐ │ │ │ │ │ access_token expires in 15 min │ │ │ │ │ │ refresh_token expires in 7 days │ │ │ │ │ └──────────────────────────────────┘ │ │ │ │ │ │ │ │ ══════╪═══════════════════╪════════════════════╪═══════════════════╪═══════════════╪══════════ TOKEN REFRESH FLOW │ │ │ │ ══════╪═══════════════════╪════════════════════╪═══════════════════╪═══════════════╪══════════ │ │ │ │ │ │ POST /refresh │ │ │ │ │ {refresh_token} │ │ │ │ │──────────────────>│ │ │ │ │ │ forward token │ │ │ │ │───────────────────>│ │ │ │ │ │ │ │ │ │ │───┐ │ │ │ │ │ │ verify token │ │ │ │ │<──┘ signature │ │ │ │ │ │ │ │ │ │ GET session:{uid}│ │ │ │ │─────────────────────────────────> │ │ │ │ │ │ ┆ ┆ ┆ ┆ ┆ ┌ ─ ─┼─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─ ─ ─ ─ ─┼─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ │ [SESSION VALID] │ │ │ │ │ │ │ │ session data │ │ │ │ │ │<─────────────────────────────────│ │ │ │ │ │ │ │ │ │ │───┐ │ │ │ │ │ │ │ sign new JWT │ │ │ │ │ │<──┘ (exp: 15min) │ │ │ │ │ │ │ │ │ │ │ │ EXPIRE session │ │ │ │ │ │ reset TTL 7d │ │ │ │ │ │─────────────────────────────────> │ │ │ │ │ │ OK │ │ │ │ │<─────────────────────────────────│ │ │ │ │ │ │ │ │ │ 200 OK │ │ │ │ │ │ {new access_token}│ │ │ │ │ │<───────────────────│ │ │ │ │ │ │ │ │ │ │ 200 OK │ │ │ │ │ │ {new access_token} │ │ │ │ │<──────────────────│ │ │ │ │ └ ─ ─┼─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─ ─ ─ ─ ─┼─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ┌ ─ ─┼─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─ ─ ─ ─ ─┼─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ │ [SESSION EXPIRED/REVOKED] │ │ │ │ │ │ │ nil │ │ │ │ │ │<─────────────────────────────────│ │ │ │ │ │ │ │ │ │ 401 Unauthorized │ │ │ │ │ │<───────────────────│ │ │ │ │ │ │ │ │ │ │ 401 Unauthorized │ │ │ │ │ │ (re-login needed)│ │ │ │ │ │<──────────────────│ │ │ │ │ │ │ │ │ │ │ └ ─ ─┼─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ ─ ─ ─ ─ ─┼─ ─ ─ ─ ─ ─ ─ ┼─ ─ ─ ─ │ │ │ │ │ ┌────┴────┐ ┌──────┴──────┐ ┌──────┴───────┐ ┌─────┴────┐ ┌────┴────┐ │ Browser │ │ API Gateway │ │ Auth Service │ │ Postgres │ │ Redis │ └─────────┘ └─────────────┘ └──────────────┘ └──────────┘ └─────────┘