สมอง SML

คลังความรู้ / การตัดสินใจ (ADR)

#backend#adr#identity#security

ADR-0004 Logout เพิกถอน session ด้วย RevocationStore

สถานะ: accepted แต่ส่วน "ไม่ทนต่อ restart" ล้าสมัย — ADR เขียนว่าเป็น map ในหน่วยความจำล้วน (...0004...md:7) แต่โค้ดปัจจุบันมี NewFileBackedRevocationStore เก็บ map เป็นไฟล์ JSON บนดิสก์ และโหลดกลับตอน start (memory_revocation_store.go:13,33,43). ตาม โค้ด: revoke ข้าม restart ได้ แต่ ยังไม่ข้าม replica (ไฟล์ท้องถิ่น + mutex).

ทำงานอย่างไร

  1. access token และ refresh token ของ login ครั้งเดียวกันใช้ jti (session id) ร่วมกัน เพิกถอน jti เดียวทำให้ทั้งคู่ใช้ไม่ได้ (...0004...md:7).
  2. Revoke(ctx, sessionID, expiresAt) ใส่ลง map แล้วเขียนไฟล์แบบ atomic (เขียน .tmp แล้ว os.Rename) (memory_revocation_store.go:63-90).
  3. IsRevoked ตรวจ map; รายการที่หมดอายุแล้วไม่ถูกโหลดกลับตอน start (memory_revocation_store.go:43-60,99).
  4. ที่ตั้งไฟล์: env REVOCATION_STORE_FILE, ถ้าไม่ตั้งใช้ <CONFIG_DIR>/revoked_sessions.json (di/container.go:79-83).

ตัวเลือกที่ไม่เลือก

ตาราง refresh_tokens ใน Main DB ของผู้เช่า (ยังไม่มีกลไก migrate ตารางใหม่เข้า DB เดิม) และ Redis (ยังไม่มีโค้ดใช้ Redis) — ...0004...md:11-12.

ข้อควรระวัง

  • RevocationStore เป็น port: สลับเป็นที่เก็บร่วม (DB/Redis) ได้โดยไม่แก้ LogoutUseCase / JWTTokenService (...0004...md:16).
  • ต้องแก้ก่อนรันมากกว่า 1 instance (k8s ตั้ง replicas: 2 — ดู การ build และ deploy backend: Docker, Kubernetes, Makefile (Deployment)) มิฉะนั้น revoke ที่ instance หนึ่งอีก instance ไม่เห็น.
  • ชื่อ struct ยังเป็น InMemoryRevocationStore แม้มีโหมดไฟล์ — อย่าสับสนเมื่อค้นโค้ด.

ที่มาในโค้ด

  • backend/internal/adapter/outbound/identity/memory_revocation_store.go:13 — doc comment: map ในโปรเซส + ไฟล์ JSON เสริม.
  • backend/internal/adapter/outbound/identity/memory_revocation_store.go:33 — NewFileBackedRevocationStore.
  • backend/internal/di/container.go:79 — เลือกไฟล์จาก REVOCATION_STORE_FILE.
  • backend/docs/adr/0004-in-memory-session-revocation.md:16 — ผลที่ตามมาตามเอกสารเดิม.

ดูเพิ่ม

JWT session token และการเพิกถอน (JWT + revocation store) · ขั้นตอน login / เลือกบริษัท / refresh / logout (Identity login flow) · ADR-0003 ข้อมูลผู้ใช้และสิทธิ์อยู่ใน DB ของแต่ละผู้เช่า ไม่ใช่ control-plane · สารบัญ ADR ของ backend (Architecture Decision Records)