ID Token vs Access Token

หากพูดถึง Token ที่ใช้กันในปัจจุบัน หลายคนคงเคยใช้ JSON Web Token (JWT) กับ OAuth Token แต่เชื่อว่าคงมีหลายคนที่เคยสงสัยเหมือนกับผมว่า แล้วมันต่างกันยังไง ใช้กับกรณีใดบ้าง ก่อนอื่นต้องมาทำความรู้จักกับประเภทของ Token กันก่อน

Type Token

Authentication Token

เป็น Token ที่ใช้ในการพิสูจน์ตัวตนของผู้ใช้ในระบบ เช่น JSON Web Token ( JWT ) ที่เป็นไปตามข้อกำหนด OpenID Connect

Access Token

เป็น Token ที่ใช้สำหรับ Application ที่ต้องการเข้าถึงข้อมูลทรัพยากรต่าง ๆ บน Server เช่น OAuth 2.0

Session Token

เป็น Token ที่ใช้ในการเก็บข้อมูล Session ของผู้ใช้ที่ Login เข้าสู่ระบบ และทำให้ระบบรู้ว่าผู้ใช้คือใครและต้องการเข้าถึงบริการหรือข้อมูลใด

Communication Token

เป็น Token ที่ใช้ในการเข้าถึงบริการหรือเครือข่าย เช่น CSRF Token ที่ใช้ในการป้องกันการโจมตีแบบ Cross-Site Request Forgery ( CSRF )

ID Token

ใข้ในการระบุตัวตนของผู้ใช้ในระบบเท่านั้น ซึ่งก็คือ Authentication Token นั่นแหละ โดยหลังจากที่เราทำการกรอก Username และ Password ระบบจะทำการ Authentication แล้วส่ง Token กลับมา เพื่อให้ Client สามารถทำการดึงข้อมูล User Profile

ไม่ควรใช้ ID Token เพื่อเข้าถึง API โดยตรง หรือ เข้าถึงทรัพยากรต่าง ๆ บนเครื่อง Server และควรทำตามมาตรฐานความปลอดภัย Token Best Practices

JWT Token ( Encode )

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT Token ( Decode )

HEADER
{
  "alg": "HS256",
  "typ": "JWT"
}
PAYLOAD
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
VERIFY SIGNATURE
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
)

Access Token

ใช้ในการเข้าถึงข้อมูลทรัพยากรต่าง ๆ บนเครื่อง Server ซึ่งก็คือ Authorization Token นั่นแหละ มักถูกส่งมาพร้อมกับ ID Token เพื่อ Allow Resource เหมาะกับการนำไปใช้กับการเข้าถึงพวก API หรือระหว่าง Service กับ Service คุยกัน

ไม่ควรกำหนด Scope ในการเข้าถึงทรัพยากรเกินความจำเป็น และในการ Implement จะต้องดูว่าจะนำไปใช้ในลักษณะใด นอกจากนี้ Access Token ไม่ใช่ Single Sign-On แต่สามารถนำไปประยุกต์ใช้ได้

Request
client_id + client_secret
Response
{
  "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
  "token_type":"Bearer",
  "expires_in":3600,
  "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
  "scope":"create"
}

Last updated 9 months ago

Last updated