Refresh Token به Family نیاز دارد، نه فقط Expiry
Access token کوتاهعمر توضیح سادهای دارد. جایی که امنیت واقعاً زندگی میکند refresh است — و جایی که بیشتر سیستمها کمطراحی میکنند.
یک refresh سادهلوحانه یک راز بلندعمر است: ارائه بده، access جدید بگیر. اگر نشت کند، مهاجم تا وقتی کسی نفهمد client مشروع بهنظر میرسد.
راهحل «refresh را کوتاهتر کن و امیدوار باش» نیست. راهحل rotation با ردیابی family است.
Rotation در یک تصویر
هم Device Session و هم User Account Session همین الگو را دارند: هر ردیف refresh یک family id، اشارهگر اختیاری replaces، expiry و متادیتای revoke دارد. Aggregate مربوط به Session به refresh فعلی اشاره میکند.
چرا Family بهجای یک راز mutable
| رویکرد | چه چیزی میشکند |
|---|---|
| یک refresh mutable در DB | race بین tabها؛ بدون سیگنال theft |
| فقط JWT refresh بدون state | revoke سخت؛ reuse نامرئی |
| Rotation بدون family | یک توکن را میکشی، lineage را از دست میدهی |
| Rotation با family | reuse هر ancestor → کشتن کل زنجیره |
Family تبار rotationهایی است که از یک login (یا device bootstrap) شروع شده. دلیل compromise در دامنه صریح است: token reuse، admin action، یا سیگنال مشکوک.
Reuse detection یعنی چه در عمل
وقتی refresh باطلشده (یا جایگزینشده) دوباره ارائه شود:
- Domain event مربوط به reuse-detected
- Session به حالت compromised
- باطل کردن family — نه فقط همان ردیف
نشت خاموش تبدیل میشود به شکست بلند و محلی: همان device / همان login میمیرد. Deviceهای دیگر روی familyهای دیگر میتوانند زنده بمانند.
Device و Account هر دو Family دارند
وسوسهانگیز است که family را فقط برای «توکن login» بگذارید. در مدل دو لایه، هم device refresh و هم account refresh رازهای باارزشاند.
- سرقت Device Family → آن client دیگر قابلاعتماد نیست؛ Account Sessionهای روی آن پاس رایگان نمیگیرند
- سرقت Account Family → آن login روی آن device مرده؛ بقیهٔ deviceها میمانند
Frontend باید اول Device را refresh کند، بعد Account را با access مؤثر Device. ترتیب اشتباه failureهای جعلی میسازد که شبیه bugاند و شما را به ضعیفکردن امنیت عادت میدهند.
دشمن پنهان: درخواستهای موازی
Browser، HTML، RSC و prefetch را موازی میزند. همه cookie منقضی میبینند و همه همان توکن را refresh میکنند.
بدون هماهنگی یا:
- reuse بیگناه (race خودتان) theft تلقی میشود، یا
- هجوم به backend و UX شکننده
Identity همچنان صحت rotation را مالک است. Edge single-flight را مالک است تا یک process خودش را له نکند. اینها لایههای مکملاند — فصل ۹ سمت Edge را میگوید.
برداشت
Expiry آسیب را محدود میکند. Family سرقت را کشف میکند.
اگر داستان refresh فقط «JWT بلندعمر تا logout» باشد، راز دارید — نه مدل امنیت Session.
بعد
OTP، password و OAuth دم در متفاوت به نظر میرسند. داخل دامنه باید روی یک مسیر session establishment همگرا شوند.
ادامه: Authentication Convergence.