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