Token Lifespans
Token Lifespans คืออะไร
หัวข้อที่มีชื่อว่า “Token Lifespans คืออะไร”ทุก token ที่ Keycloak ออกมีอายุ (lifespan) การตั้งค่าที่ถูกต้องเป็นการสมดุลระหว่างประสบการณ์ผู้ใช้ (ไม่ต้อง login ซ้ำบ่อย) กับความปลอดภัย (จำกัดความเสียหายหาก token หลุด)
ประเภท Token และ Lifespan
หัวข้อที่มีชื่อว่า “ประเภท Token และ Lifespan”| Token | ค่าเริ่มต้นและหมายเหตุ |
|---|---|
| Access token | ค่าเริ่มต้น 5 นาที — อายุสั้นโดยตั้งใจเพื่อจำกัดความเสียหายหากหลุด |
| Refresh token | ควบคุมด้วย SSO session idle และ SSO session max |
| Offline token | เป็น refresh token ที่รอดจากการ restart server |
ที่ตั้งค่า Lifespan
หัวข้อที่มีชื่อว่า “ที่ตั้งค่า Lifespan”มีสองที่หลักในการตั้งค่า lifespan:
- Realm settings — ตั้งค่าระดับ realm เป็น default ให้ client ทั้งหมด
- Client Advanced tab — override ค่าเฉพาะสำหรับ client นั้นๆ
วิธีตั้งค่า Lifespan ระดับ Realm
หัวข้อที่มีชื่อว่า “วิธีตั้งค่า Lifespan ระดับ Realm”- ไปที่ Realm settings → tab Tokens
- ปรับ Access Token Lifespan ตามต้องการ (เช่น 5 นาที)
- ปรับ SSO Session Idle และ SSO Session Max เพื่อควบคุม refresh token
- คลิก Save
วิธี Override Lifespan สำหรับ Client เดียว
หัวข้อที่มีชื่อว่า “วิธี Override Lifespan สำหรับ Client เดียว”- ไปที่ Clients → เลือก client ของคุณ
- คลิก tab Advanced
- เลื่อนลงไปที่ส่วน Token Lifespan
- ตั้งค่า Access Token Lifespan เป็นค่าที่ต้องการ
- คลิก Save
วิธีตรวจสอบ Expiry ของ Token
หัวข้อที่มีชื่อว่า “วิธีตรวจสอบ Expiry ของ Token”jwt_payload=$(echo "YOUR_ACCESS_TOKEN" | cut -d '.' -f2 | base64 -d 2>/dev/null); echo $jwt_payload | python3 -m json.toolข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| Access token อายุสั้น (1–5 นาที) | จำกัด window ที่ token ซึ่งถูกขโมยจะใช้งานได้ — หลุดไปก็หมดอายุเร็วก่อนผู้โจมตีจะใช้ประโยชน์ได้มาก | ต้อง refresh บ่อยขึ้น เพิ่มจำนวน round-trip ไปยัง token endpoint และเพิ่ม load บน Keycloak |
| Access token อายุยาว (30–60 นาทีขึ้นไป) | Client เรียก refresh น้อยลง ลด latency ฝั่ง client และลด load บน token endpoint | ถ้า token หลุดออกไป ผู้โจมตีใช้งานได้นานขึ้นมาก เพราะ access token เป็น stateless JWT ที่ revoke กลางคันไม่ได้ ต้องรอให้หมดอายุเอง |
| Refresh token / SSO session idle สั้น | บังคับให้ session ตายไวเมื่อผู้ใช้ไม่ได้ใช้งาน ลดความเสี่ยงจาก refresh token ที่หลุดไปพร้อมเครื่องที่ถูกทิ้งไว้ | ผู้ใช้ต้อง login ใหม่บ่อยขึ้นถ้าห่างจากแอปไปนาน กระทบ UX โดยเฉพาะแอปที่เปิดค้างไว้เป็นพักๆ |
| Offline token (refresh token ที่รอดจากการ restart server) | เหมาะกับ background job หรือ mobile app ที่ต้องทำงานต่อเนื่องโดยไม่มี user คอย login ซ้ำ | มีอายุยาวมากโดยธรรมชาติ ถ้าหลุดหรือไม่ถูก revoke ตอนเลิกใช้งาน ผู้โจมตีเข้าถึงได้เป็นระยะเวลานาน |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- ตั้ง access token lifespan ไว้ 1 ชั่วโมงขึ้นไป “เพื่อความสะดวก” — ยิ่ง lifespan ยาว ยิ่งขยาย window ที่ token ที่หลุดไปใช้งานได้ เพราะ access token แบบ JWT revoke กลางคันไม่ได้ ควรตั้งให้สั้น (นาทีหลักหน่วยถึงสิบ) แล้วพึ่ง refresh token แทน
- เก็บ access token หรือ refresh token ไว้ใน localStorage — JavaScript ใดๆ ที่รันบนหน้าเว็บอ่าน localStorage ได้ทั้งหมด หากแอปมีช่องโหว่ XSS แม้จุดเดียว ผู้โจมตีขโมย token ไปใช้ต่อได้ทันที ควรเก็บใน memory หรือ httpOnly cookie แทน
- ใส่ข้อมูลที่เปลี่ยนแปลงบ่อยหรือ sensitive ลงใน token claim แล้วคาดหวังให้เป็น real-time (เช่น role ปัจจุบัน, ยอดเงิน, สถานะ subscription) — claim คือ snapshot ณ เวลาที่ token ถูกออกเท่านั้น ค่าจะไม่อัปเดตจนกว่าจะมีการ refresh token ใหม่ ทำให้ระบบที่เชื่อ claim เหล่านี้ตรงๆ อาจใช้ข้อมูลเก่าโดยไม่รู้ตัว
- ไม่ตั้ง SSO Session Max ให้เหมาะสม — ปล่อยให้ session ต่ออายุได้เรื่อยๆ ผ่านการ refresh แบบไม่มีเพดานเวลาสูงสุด ทำให้ session ที่ควรตายไปนานแล้วยังใช้งานได้อยู่
💡 ตัวอย่างจากของจริง
แอปธนาคาร (banking apps) — มักตั้ง access token lifespan สั้นมากประมาณ 5 นาทีสำหรับแอปที่ต้องการความปลอดภัยสูง เพื่อจำกัดความเสียหายให้เหลือน้อยที่สุดหาก token หลุดออกไประหว่างทำธุรกรรม
Netflix-style device revocation — ใช้ access token อายุสั้นร่วมกับการ revoke refresh token เฉพาะ device เมื่อผู้ใช้กด “sign out this device” ทำให้ session บนทีวีหรือมือถือเครื่องหนึ่งถูกตัดออกได้เกือบทันที โดยไม่กระทบ session บนอุปกรณ์อื่นเลย