OAuth 2.1 vs OAuth 2.0: Apa yang Berubah dan Cara Migrasi

Foto oleh FlyD on Unsplash
OAuth 2.1 menggabungkan OAuth 2.0 (RFC 6749) dan praktik keamanan terbaiknya ke dalam satu spesifikasi yang mengusangkan RFC 6749 dan RFC 6750. Ia menghapus fitur tidak aman alih-alih menambah fitur baru: PKCE menjadi wajib, implicit dan password grant dihilangkan, serta aturan token dan redirect diperketat.
Ya. Di OAuth 2.0 PKCE bersifat opsional dan terutama disarankan untuk aplikasi mobile dan single-page. OAuth 2.1 mewajibkan PKCE untuk semua klien yang memakai alur authorization code, termasuk aplikasi web sisi server konfidensial, untuk mencegah serangan pencegatan dan injeksi authorization code.
Dua grant dihilangkan: implicit grant, yang mengembalikan access token langsung di URL redirect, dan resource owner password credentials grant, yang membuat aplikasi mengumpulkan password asli pengguna. Aplikasi browser sebaiknya memakai authorization code dengan PKCE, dan klien mesin memakai client credentials.
Spesifikasi otorisasi MCP dibangun langsung di atas OAuth 2.1. Ia menyatakan authorization server HARUS mengimplementasikan OAuth 2.1 dan klien MCP HARUS mengimplementasikan PKCE, dengan merujuk draft-ietf-oauth-v2-1-13. Server MCP terproteksi berperan sebagai OAuth 2.1 resource server dan access token harus dikirim di header Authorization, tidak pernah di query string.
Migrasikan secara bertahap: pertama tambahkan PKCE ke setiap klien authorization code karena kompatibel mundur, lalu pensiunkan implicit dan password grant, kemudian hentikan penerimaan bearer token di query string, dan terakhir terapkan pencocokan redirect URI persis serta rotasi refresh token untuk klien publik. Tidak perlu penulisan ulang sekaligus.

Foto oleh FlyD on Unsplash
Ringkasan Utama
OAuth 2.1 menggabungkan OAuth 2.0 dan praktik keamanan terbaiknya ke dalam satu spesifikasi. PKCE menjadi wajib untuk setiap klien yang memakai alur authorization code, implicit dan password grant dihapus, bearer token dilarang di query string URL, redirect URI harus dicocokkan persis, dan rotasi refresh token diwajibkan untuk klien publik.
OAuth 2.0 tidak pernah berupa satu dokumen. Ia terdiri dari RFC 6749 tahun 2012, aturan bearer token di RFC 6750, lalu satu dekade catatan praktik terbaik terpisah yang menambal celah yang ditinggalkan kerangka aslinya. Jika Anda belajar OAuth dari tutorial yang ditulis tahun 2015, hampir pasti Anda mempelajari pola yang kini diam-diam sudah ditinggalkan komunitas. OAuth 2.1 adalah pembersihannya: satu spesifikasi yang mempertahankan yang berhasil, menghapus yang terbukti berbahaya, dan memasukkan panduan keamanan langsung ke dalam teks normatifnya.
Saya sudah cukup banyak membangun integrasi untuk tahu jurang antara apa yang diizinkan spesifikasi lama dan apa yang seharusnya benar-benar Anda lakukan di produksi. OAuth 2.1 menutup jurang itu dengan menjadikan jalur aman sebagai satu-satunya jalur. Tulisan ini membahas persis apa yang berubah, menampilkan pertukaran Authorization Code plus PKCE yang akurat, dan memberi Anda urutan migrasi yang bisa diikuti tanpa merusak klien yang sedang berjalan.
Draf ini eksplisit menyatakan bahwa ia menggantikan dan menganggap usang RFC 6749 dan RFC 6750, menggabungkan informasi dari dokumen-dokumen itu dan praktik keamanan terbaik ke dalam satu spesifikasi Standards Track sekaligus menghapus fitur yang ditemukan tidak aman. Tidak ada format token baru, tidak ada grant inti baru, dan tidak ada endpoint baru. Jika Anda sudah menjalankan alur authorization code dengan benar hari ini, sebagian besar sistem Anda sudah patuh OAuth 2.1. Pekerjaannya ada pada apa yang harus Anda hentikan.
Di OAuth 2.0, Proof Key for Code Exchange hanyalah tambahan, terutama disarankan untuk aplikasi mobile dan single-page yang tidak bisa menyimpan rahasia. OAuth 2.1 menaikkannya menjadi persyaratan dasar: PKCE wajib untuk semua klien yang memakai alur authorization code, termasuk server web konfidensial. Klien membuat verifier acak, mengirim hanya hash-nya sebagai challenge pada permintaan otorisasi, lalu mengungkapkan verifier saat menukar code. Penyerang yang mencegat code tidak bisa menukarnya tanpa verifier asli.
# 1. Client generates a PKCE pair (S256)
code_verifier = base64url( random(32 bytes) )
code_challenge = base64url( SHA256(code_verifier) )
# 2. Authorization request — a browser redirect that returns a code, never a token
GET /authorize?response_type=code
&client_id=s6BhdRkqt3
&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback
&scope=read%20write
&state=xyz
&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256 HTTP/1.1
Host: as.example.com
# 3. Authorization server redirects back with a short-lived, one-time code
HTTP/1.1 302 Found
Location: https://app.example.com/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
# 4. Token request — the client proves it owns the verifier behind that challenge
POST /token HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback
&client_id=s6BhdRkqt3
&code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXkNilai verifier dan challenge pada contoh di atas adalah test vector kanonis dari RFC 7636 Lampiran B. Gunakan untuk menguji implementasi S256 Anda sendiri: mem-hash verifier persis itu dengan SHA-256 lalu meng-encode base64url harus menghasilkan challenge persis itu, atau encoding Anda salah.
OAuth 2.1 menghilangkan dua alur yang didefinisikan RFC 6749. Keduanya membocorkan token atau kredensial dengan cara yang tak bisa sepenuhnya diperbaiki oleh konfigurasi apa pun, jadi alih-alih mendokumentasikan solusi tambal, spesifikasi cukup menghapusnya.
Jika Anda punya salah satu alur ini di produksi, itulah migrasi yang membawa risiko nyata, karena mengubah cara klien memperoleh token. Selebihnya OAuth 2.1 sebagian besar hanya memperketat aturan yang mungkin sudah nyaris Anda ikuti.
Tiga perubahan yang lebih kecil namun penting memperkuat bagian OAuth yang paling sering dijadikan sasaran penyerang.
Pencocokan redirect URI persis dapat merusak integrasi yang mengandalkan parameter query dinamis yang ditambahkan ke callback. Pindahkan data per-permintaan ke parameter state atau sesi yang dilindungi PKCE, bukan ke redirect URI, sebelum Anda mengaktifkannya, atau callback Anda akan mulai ditolak.
| Aspek | OAuth 2.0 | OAuth 2.1 |
|---|---|---|
| PKCE | Opsional, disarankan untuk klien publik | Wajib untuk semua klien yang memakai alur authorization code |
| Implicit grant (token di redirect) | Didefinisikan dan diizinkan | Dihapus dari spesifikasi |
| Password grant (kredensial pemilik) | Didefinisikan dan diizinkan | Dihapus dari spesifikasi |
| Bearer token di query string URL | Diizinkan oleh RFC 6750 | Tidak diizinkan; hanya header atau body permintaan |
| Pencocokan redirect URI | Pencocokan longgar lazim dalam praktik | Pencocokan string persis diwajibkan |
| Refresh token untuk klien publik | Berumur panjang dan dapat dipakai ulang | Harus sender-constrained atau sekali pakai |
| Dokumen dasar | RFC 6749 plus RFC 6750 plus catatan terpisah | Satu spesifikasi yang mengusangkan 6749 dan 6750 |
Alasan OAuth 2.1 tiba-tiba penting bagi banyak developer adalah Model Context Protocol. MCP adalah cara klien AI terhubung ke server alat dan data eksternal, dan spesifikasi otorisasinya dibangun langsung di atas OAuth 2.1. Spesifikasi MCP menyatakan bahwa authorization server harus mengimplementasikan OAuth 2.1 dengan langkah keamanan yang sesuai untuk klien konfidensial maupun publik, dan bahwa klien MCP harus mengimplementasikan PKCE sesuai OAuth 2.1. Ia menyematkan referensi persisnya: draft-ietf-oauth-v2-1-13.
Dalam istilah MCP, server MCP terproteksi berperan sebagai OAuth 2.1 resource server, klien MCP adalah klien OAuth 2.1, dan access token hanya berjalan di header Authorization, tidak pernah di query string. MCP juga menambahkan resource indicators dari RFC 8707 sehingga token terikat pada server spesifik tempat ia diterbitkan, serta mewajibkan rotasi refresh token untuk klien publik. Jika Anda membangun server MCP, Anda sedang mengimplementasikan OAuth 2.1 entah Anda berniat atau tidak.
Anda tidak perlu penulisan ulang sekaligus. Migrasikan dengan urutan yang menghapus pola paling berisiko lebih dulu dan menyisakan pengetatan yang kompatibel untuk terakhir.
Lakukan empat langkah ini secara berurutan dan Anda mendarat di OAuth 2.1 tanpa hari peralihan mendadak. Imbalannya adalah permukaan serangan lebih kecil, satu spesifikasi otoritatif alih-alih perburuan lintas banyak RFC, dan pengaturan token yang sudah kompatibel dengan MCP serta gelombang perkakas AI yang dibangun di atasnya.