O

OIDC vs OAuth 2.0

  • OIDC: tầng identity (xác thực - biết thằng user là ai)
  • OAuth 2.0: tầng authorization (ủy quyền - cho phép làm gì)

ID Token vs Access Token

Đặc điểmID TokenAccess Token
Mục đíchbiết thằng user là ai (Authn)cấp quyền vào API (Authz)
UserFrontendAPI / Backend / Resource Server
Định dạngluôn là JWTtùy hệ thống (Opaque/JWT)

=> ID Token: dùng để Xác thực. => Access Token: dùng để Gọi API/Tài nguyên.

Security Boundaries (Lưu ý quan trọng)

  • Tuyệt đối không sử dụng Access Token để xác thực người dùng trên Frontend.
  • Tương tự, không gửi ID Token lên API như một dạng Access Token.
  • Mỗi loại Token được thiết kế với Audience (đối tượng tiêu thụ) và mục đích riêng biệt theo tiêu chuẩn RFC.

Cấu trúc ID Token

định dạng: JWT (3 phần: header.payload.signature)

=> quan trọng nhất: payload (claims)

mấy field bắt buộc

  • iss: thằng cấp token (Google, Reddit...)
  • sub: id user (dùng cái này làm userId trong DB là chuẩn nhất)
  • aud: app nào được cấp (phải match client_id của mình)
  • exp: hết hạn
  • iat: tạo lúc nào

mấy field nên dùng

  • nonce: chống replay (gửi lên cái gì thì trả về phải giống hệt)
  • auth_time: user login lúc nào (useful khi cần bắt login lại)
  • azp: xác định client chính xác khi aud có nhiều giá trị
  • email/profile: nếu xin scope là có luôn info, khỏi gọi /me mất công. Đây là lý do OIDC "ngon" hơn OAuth2.

Validate (QUAN TRỌNG NHẤT)

đừng bao giờ tin token mà không check:

  1. lấy Public Key (JWKS) của provider.
  2. verify signature: dùng public key để đảm bảo token không bị sửa và đúng là do provider đó ký.
  3. check payload: đúng iss, đúng aud, chưa exp.
  4. check nonce: nếu có (phải khớp với chuỗi ngẫu nhiên bạn gửi lúc khởi tạo login).

=> thiếu 1 bước là mở cửa cho bug/security 💀.


So với /me (Reddit Style)

oauth2 thuần:

  • access_token
  • phải gọi thêm API /me để lấy info user
  • phụ thuộc hoàn toàn vào API bên ngoài, tính verify kém

oidc:

  • decode id_token là xong
  • không cần call API thêm lượt nào (giảm round-trip)
  • tự verify được tính toàn vẹn ngay tại local

chốt hạ

  • OAuth 2.0 = xin quyền truy cập.
  • OIDC = biết danh tính user.
  • đã có OIDC thì hãy tận dụng ID Token để lấy identity, đừng dùng Access Token đi "hỏi thăm" /me lung tung.