OAuth Security Pitfalls — Security

OAuth 2.0 dan Keamanannya OAuth 2.0 adalah protokol authorization yang memungkinkan aplikasi pihak ketiga mengakses resource pengguna tanpa mengetahui…

OAuth 2.0 dan Keamanannya

OAuth 2.0 adalah protokol authorization yang memungkinkan aplikasi pihak ketiga mengakses resource pengguna tanpa mengetahui password-nya. Meskipun OAuth sudah matang, implementasi yang salah bisa membuka celah keamanan serius.

OAuth 2.0 Authorization Code Flow

// 1. Client mengarahkan user ke authorization server
GET https://auth.example.com/authorize?
    response_type=code&
    client_id=myapp&
    redirect_uri=https://myapp.com/callback&
    scope=read:profile&
    state=random123  // WAJIB untuk mencegah CSRF

// 2. User login dan memberikan izin
// 3. Authorization server redirect ke callback dengan code
GET https://myapp.com/callback?code=AUTH_CODE&state=random123

// 4. Client menukar code dengan access token (server-side)
POST https://auth.example.com/token
{ "grant_type": "authorization_code", "code": "AUTH_CODE", ... }

Vulnerability Umum OAuth

1. Missing State Parameter (CSRF)

Tanpa state parameter, penyerang bisa memaksa korban menghubungkan akun mereka dengan akun penyerang:

// VULNERABLE: tanpa state
GET /authorize?response_type=code&client_id=app&redirect_uri=...

// AMAN: dengan state yang divalidasi
const state = crypto.randomBytes(16).toString("hex");
req.session.oauthState = state;
// Redirect ke authorize dengan state=...
// Di callback, validasi state === req.session.oauthState

2. Open Redirect

Jika redirect_uri tidak divalidasi secara ketat, penyerang bisa mengarahkan authorization code ke server mereka.

3. Token Leakage

PKCE (Proof Key for Code Exchange)

// PKCE menambahkan perlindungan untuk authorization code
// 1. Generate code_verifier (random string)
const verifier = crypto.randomBytes(32).toString("base64url");

// 2. Hash menjadi code_challenge
const challenge = crypto.createHash("sha256")
    .update(verifier).digest("base64url");

// 3. Kirim challenge di authorize request
GET /authorize?...&code_challenge=xxx&code_challenge_method=S256

// 4. Kirim verifier di token request
POST /token { ..., code_verifier: verifier }

Best Practices OAuth

Yang akan kamu pelajari