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ểm | ID Token | Access Token |
|---|---|---|
| Mục đích | biết thằng user là ai (Authn) | cấp quyền vào API (Authz) |
| User | Frontend | API / Backend / Resource Server |
| Định dạng | luôn là JWT | tù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
userIdtrong DB là chuẩn nhất) - aud: app nào được cấp (phải match
client_idcủ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
audcó nhiều giá trị - email/profile: nếu xin scope là có luôn info, khỏi gọi
/memấ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:
- lấy Public Key (JWKS) của provider.
- verify signature: dùng public key để đảm bảo token không bị sửa và đúng là do provider đó ký.
- check payload: đúng
iss, đúngaud, chưaexp. - 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:
- có
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"
/melung tung.