ข้ามไปยังเนื้อหา

Token Lifespans

ทุก token ที่ Keycloak ออกมีอายุ (lifespan) การตั้งค่าที่ถูกต้องเป็นการสมดุลระหว่างประสบการณ์ผู้ใช้ (ไม่ต้อง login ซ้ำบ่อย) กับความปลอดภัย (จำกัดความเสียหายหาก token หลุด)

Tokenค่าเริ่มต้นและหมายเหตุ
Access tokenค่าเริ่มต้น 5 นาที — อายุสั้นโดยตั้งใจเพื่อจำกัดความเสียหายหากหลุด
Refresh tokenควบคุมด้วย SSO session idle และ SSO session max
Offline tokenเป็น refresh token ที่รอดจากการ restart server

มีสองที่หลักในการตั้งค่า lifespan:

  • Realm settings — ตั้งค่าระดับ realm เป็น default ให้ client ทั้งหมด
  • Client Advanced tab — override ค่าเฉพาะสำหรับ client นั้นๆ
  1. ไปที่ Realm settings → tab Tokens
  2. ปรับ Access Token Lifespan ตามต้องการ (เช่น 5 นาที)
  3. ปรับ SSO Session Idle และ SSO Session Max เพื่อควบคุม refresh token
  4. คลิก Save
  1. ไปที่ Clients → เลือก client ของคุณ
  2. คลิก tab Advanced
  3. เลื่อนลงไปที่ส่วน Token Lifespan
  4. ตั้งค่า Access Token Lifespan เป็นค่าที่ต้องการ
  5. คลิก Save
jwt_payload=$(echo "YOUR_ACCESS_TOKEN" | cut -d '.' -f2 | base64 -d 2>/dev/null); echo $jwt_payload | python3 -m json.tool
ตัวเลือกBenefitCost
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 บนอุปกรณ์อื่นเลย

จะตั้งค่า access token lifespan เริ่มต้นของ realm ได้ที่ไหน?
SSO Session Idle ควบคุมอะไร?
ข้อดีของการตั้งค่า access token lifespan ให้สั้นคืออะไร?
จะ override access token lifespan สำหรับ client เดียวได้อย่างไร?