Client Scopes
Client Scopes คืออะไร
หัวข้อที่มีชื่อว่า “Client Scopes คืออะไร”Client scope คือชุดของ mapper ที่ตั้งชื่อและนำกลับมาใช้ซ้ำได้ ช่วยให้กำหนด claim ชุดหนึ่งครั้งแล้ว attach ให้ client หลายตัวได้ แทนที่จะกำหนด mapper ซ้ำในแต่ละ client
Default vs Optional Scope
หัวข้อที่มีชื่อว่า “Default vs Optional Scope”- Default scope จะรวมอยู่เสมอในทุก token request โดยไม่ต้องระบุเพิ่มเติม
- Optional scope จะรวมเฉพาะเมื่อ authorization request ระบุอย่างชัดเจนผ่าน scope parameter
Built-in Scopes
หัวข้อที่มีชื่อว่า “Built-in Scopes”| Scope | สิ่งที่เพิ่มลงใน Token |
|---|---|
profile | เพิ่ม name, given_name, family_name, preferred_username |
email | เพิ่ม email, email_verified |
roles | เพิ่ม realm_access, resource_access |
openid | จำเป็นสำหรับ OIDC |
offline_access | ให้ refresh token ที่อยู่ได้นาน |
วิธี Assign Optional Scope ให้ Client
หัวข้อที่มีชื่อว่า “วิธี Assign Optional Scope ให้ Client”- ไปที่ Clients → เลือก client ของคุณ
- คลิก tab Client scopes
- คลิก Add client scope
- เลือก scope ที่ต้องการแล้วตั้งเป็น Optional
- คลิก Add
วิธีสร้าง Custom Scope
หัวข้อที่มีชื่อว่า “วิธีสร้าง Custom Scope”- ไปที่ Client scopes → คลิก Create client scope
- ตั้งชื่อ scope เช่น
orders:read - เลือก Protocol:
openid-connect - คลิก Save
- ไปที่ tab Mappers เพื่อเพิ่ม mapper ลงใน scope นี้
ตัวอย่าง Authorization Request พร้อม Optional Scope
หัวข้อที่มีชื่อว่า “ตัวอย่าง Authorization Request พร้อม Optional Scope”https://auth.example.com/realms/my-app/protocol/openid-connect/auth?client_id=my-app-frontend&response_type=code&redirect_uri=https://app.example.com/callback&scope=openid%20profile%20email%20addressข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| Default scope | ทุก client ได้ claim ชุดเดียวกันอัตโนมัติโดยไม่ต้องตั้งค่าเพิ่ม ลดโอกาส config ผิดพลาดหรือลืม assign | Token มีขนาดใหญ่ขึ้นเสมอ แม้บาง client จะไม่เคยใช้ claim นั้นเลย |
| Optional scope | Token เล็กลง เพราะมีเฉพาะ claim ที่ client ร้องขอจริงผ่าน scope parameter | Client ต้องจำและระบุ scope ทุกครั้งใน authorization request ถ้าลืมจะไม่ได้ claim ที่ต้องการ |
แยก scope ตาม API (เช่น orders:read, billing:write) แทนที่จะรวมไว้ scope เดียว | ควบคุมสิทธิ์แบบ least privilege ได้ละเอียดต่อ client ต่อ use case | ต้อง maintain scope และ mapper หลายชุดมากขึ้น เพิ่มภาระดูแล |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- ตั้งทุก custom scope เป็น default — ทำให้ token บวมด้วย claim ที่ client ส่วนใหญ่ไม่ได้ใช้ ควรตั้งเป็น optional แล้วให้ client ที่ต้องการจริงร้องขอเอง
- ลืมระบุ scope ใน authorization request แล้วสงสัยว่าทำไม claim ไม่มา — การ assign optional scope ให้ client เพียงอย่างเดียวไม่ทำให้ claim ปรากฏใน token อัตโนมัติ ต้องระบุใน
scopeparameter ของ request ด้วยเสมอ - ใช้ scope เดียวสำหรับหลาย API ที่ระดับสิทธิ์ต่างกัน — ทำให้ทุก client ที่ได้ scope นั้นมีสิทธิ์เท่ากันหมด ควรแยก scope ตามระดับความเสี่ยงของแต่ละ API
💡 ตัวอย่างจากของจริง
Multi-tenant SaaS platform — แยก optional scope ตาม module เช่น
billing,reports,adminเพื่อให้ token ของแต่ละ integration หรือ third-party app มีแค่ claim ที่จำเป็นต่อ module ที่ขอใช้งานจริงAPI gateway ระดับองค์กร — ใช้ default scope
rolesเพื่อให้ทุก client ได้ realm/client role claim พื้นฐานเสมอ ส่วน scope ที่ละเอียดอ่อนกว่าอย่างข้อมูลการเงินตั้งเป็น optional และเปิดให้เฉพาะ client ที่ผ่านการอนุมัติ