Skip to content

Security Model

Dokumen ini menjelaskan kebijakan keamanan publik yang harus dipahami client dan resource server.

PKCE S256 Wajib

PKCE S256 wajib untuk semua client, termasuk confidential client. OP menolak request /authorize yang tidak mengirim code_challenge_method=S256 dan code_challenge.

Konsekuensi integrasi:

Library/pendekatanStatus
openid-client, authlib, SDK yang mendukung PKCEDirekomendasikan.
passport-oauth2 polos tanpa PKCETidak kompatibel.
Manual OAuth tanpa code_verifierTidak kompatibel.

Token Lifetimes

ArtefakLifetimeCatatan
Authorization code120 detikSekali pakai.
Auth request900 detikState server-side selama login/consent.
Access token15 menitJWT ES256, aud = sso-resource-api.
ID token15 menitJWT ES256, aud = client_id.
Refresh token30 hariDirotasi setiap dipakai.
Refresh token family90 hariReuse detection mencabut family.

Refresh Token Rotation

Refresh token baru diterbitkan pada setiap grant refresh_token. Token lama langsung tidak berlaku. Jika token lama dipakai ulang, itu dianggap replay: family refresh token dicabut dan event keamanan dicatat.

Praktik client:

  1. Simpan refresh token hanya di server atau storage aman.
  2. Update refresh token secara atomik setelah refresh sukses.
  3. Jika dua proses refresh bersamaan, pastikan hanya satu yang menang.
  4. Pada invalid_grant, jangan retry token lama terus-menerus; minta login ulang.

Rate Limits

AreaLimit
/authorize, /oauth2/authorize20/min/IP
/token, /oauth2/token, revocation, introspection30/min/IP
/userinfo60/min/IP
Discovery60/min/IP
JWKS60/min/IP

Pada 429, hormati Retry-After. Gunakan backoff dan jangan parallel-refresh banyak request dengan refresh token yang sama.

Signing dan JWKS

Token ditandatangani ES256 (P-256). Discovery mengiklankan jwks_uri dan id_token_signing_alg_values_supported.

Resource server wajib:

  1. Ambil JWKS dari discovery.
  2. Cache JWKS sesuai header/cache policy.
  3. Re-fetch JWKS bila kid token tidak dikenal.
  4. Tolak alg=none dan algoritma selain yang di-discovery.
  5. Validasi iss, aud, exp, nbf, iat, dan token_use.

Client Checklist

  • Gunakan HTTPS untuk semua redirect URI production.
  • Pakai state dan nonce acak, simpan sementara, validasi saat callback.
  • Jangan log code, token, refresh token, client secret, atau ID token.
  • Confidential client menyimpan secret di server/key vault, bukan browser.
  • Public client tidak punya secret; bergantung pada PKCE dan redirect URI policy.
  • Gunakan discovery sebagai sumber endpoint.
  • Tangani error_ref dan request_id di UI error/support.
  • Untuk API call, kirim access token sebagai Bearer dan validasi di resource server.

Released under the MIT License.