Prompt dan Konteks yang Berlaku
Sebuah Service Worker harus mencegat hanya rute gambar dan dokumen same-origin serta mengekstrak ID tenant dan resource. Rancang matcher URLPattern yang mencakup batasan komponen, grup, aturan huruf besar/kecil, dan fallback untuk browser yang tidak didukung.
URLPattern adalah matcher pola URL terstandarisasi untuk komponen protokol, host, port, pathname, search, dan hash, dengan capture group bernama atau bernomor. Ini berguna untuk perutean (routing), caching Service Worker, dan aturan edge, tetapi kecocokan bukanlah otorisasi dan tidak menggantikan normalisasi atau pemeriksaan akses.
Hal yang Dievaluasi Pewawancara
Cakup pencocokan komponen alih-alih pencocokan seluruh string, sintaks wildcard dan grup, baseURL untuk pola relatif, perilaku huruf besar/kecil per komponen, batas kepercayaan dari hasil capture, kegagalan kompilasi, dan kompatibilitas lintas browser.
Pertanyaan Klarifikasi
Konfirmasikan protokol, host, dan port yang diizinkan; apakah jalur (path) peka huruf besar/kecil (case-sensitive); apakah parameter pencarian berpartisipasi; dan apakah ID tenant serta resource harus lengkap. Konfirmasikan juga konteks halaman, Service Worker, atau Worker, dukungan browser, serta apakah kecocokan memengaruhi keputusan caching atau keamanan.
Kerangka Jawaban 30 Detik
“Saya akan menetapkan komponen protokol, host, dan port, menggunakan named groups hanya di path, dan menetapkan baseURL eksplisit untuk pola relatif. Konstruksi saat waktu kompilasi menangkap kesalahan sintaks; pada saat runtime saya akan mencocokkan URL lengkap, memberlakukan same-origin, lalu menggunakan capture untuk perutean atau kunci cache. URLPattern menyediakan pencocokan, bukan otorisasi. Browser yang tidak didukung mendapatkan fallback komponen URL terbatas yang dicakup oleh pengujian yang sama, bukan regex luas yang mengimplementasikan ulang semantik URL.”
Pembahasan Mendalam Langkah demi Langkah
Langkah 1: Bangun pola yang sadar komponen (component-aware)
URLPattern menerima objek dengan protocol, hostname, port, pathname, search, dan hash, atau string bergaya URL. Rute yang sensitif terhadap keamanan harus menetapkan protokol dan host alih-alih menerima origin mana pun yang kebetulan memiliki path yang sama.
Langkah 2: Gunakan named capture groups
Grup path bernama dapat dibaca dari hasil exec() dan dipetakan ke field tenant dan resource. Sebuah capture hanya membuktikan bahwa string memiliki bentuk yang diharapkan; validasi set karakter, panjang, dan keberadaan bisnisnya secara terpisah.
const assetPattern = new URLPattern({
protocol: "https",
hostname: "cdn.example.com",
pathname: "/tenant/:tenantId/assets/:assetId.:ext",
});
const match = assetPattern.exec(request.url);
const assetId = match?.pathname.groups.assetId;Langkah 3: Tentukan batasan wildcard dan pemisah
Wildcard mencocokkan karakter di dalam komponennya; jangan berasumsi bahwa wildcard melintasi pemisah path atau mencakup parameter pencarian secara otomatis. Tulis setiap tingkat hierarki secara eksplisit dan uji nilai kosong, garis miring ekstra, serta karakter yang di-encode.
Langkah 4: Pahami baseURL dan pola relatif
Pola relatif memerlukan baseURL untuk menyelesaikan protokol, host, dan komponen lainnya. Oleh karena itu, lingkungan yang berbeda dapat menghasilkan matcher yang berbeda. Tetapkan base saat konstruksi dan uji domain pengembangan, pratinjau, dan produksi.
Langkah 5: Tangani aturan huruf besar/kecil dan normalisasi
Komponen URL memiliki aturan huruf besar/kecil yang berbeda. Nama host umumnya tidak peka huruf besar/kecil, sedangkan path dan komponen lainnya mungkin peka huruf besar/kecil. Jangan mengubah seluruh URL menjadi huruf kecil sebelum pencocokan karena hal itu dapat mengubah jalur resource atau input tanda tangan (signature).
Langkah 6: Pisahkan pencocokan dari otorisasi
URLPattern tidak membuktikan bahwa suatu tenant milik pengguna atau bahwa suatu resource dapat dibaca. Setelah pencocokan, terapkan pemeriksaan origin, autentikasi, otorisasi, isolasi cache, dan tipe respons. ID tenant yang di-capture tetap merupakan input yang tidak tepercaya.
Langkah 7: Kesalahan kompilasi dan biaya runtime
Pola di-parse selama konstruksi, sehingga sintaks yang tidak valid harus gagal saat startup atau pendaftaran daripada pada permintaan pertama. Gunakan kembali instance yang sudah dikompilasi alih-alih membangunnya satu per satu untuk setiap permintaan, dan ukur biaya pencocokan terhadap distribusi URL nyata pada hot path.
Langkah 8: Rancang fallback kompatibilitas
Lingkungan yang tidak didukung dapat menggunakan new URL() dan hanya memeriksa komponen yang dibutuhkan bisnis. Jangan gunakan regex luas untuk mereproduksi parsing protokol, host, encoding, dan pencarian. Fallback harus berbagi vektor uji yang sama dengan matcher bawaan (native).
Contoh Jawaban Berkualitas Tinggi
Saya akan membangun URLPattern dengan https yang tetap, host CDN yang tetap, dan komponen path eksplisit, menggunakan named groups untuk ID tenant dan resource. Service Worker akan mencocokkan URL lengkap, kemudian memberlakukan same-origin, autentikasi, dan partisi cache; hasil capture tetap merupakan string yang tidak tepercaya dan masih memerlukan pemeriksaan panjang, set karakter, serta otorisasi. Buat pola sekali dan lakukan fail fast pada kesalahan sintaks. Tetapkan baseURL ke domain deployment dan uji perbedaan huruf besar/kecil, garis miring yang di-encode, parameter pencarian tambahan, dan setiap lingkungan. Browser lama menggunakan fallback komponen URL terbatas, tidak pernah menggunakan regex luas yang mengklaim mereproduksi semantik URL lengkap.
Kesalahan Umum
Hanya mencocokkan pathname dan mengasumsikan same-origin
Protokol atau host apa pun dapat melewati path yang sama. Matcher yang sensitif terhadap keamanan harus menetapkan komponen origin dan memeriksa ulang origin permintaan saat runtime.
Memperlakukan capture sebagai ID yang tervalidasi
Capture hanya membuktikan bentuk. Validasi set karakter, panjang, kepemilikan tenant, keberadaan resource, dan otorisasi.
Mengubah semua URL menjadi huruf kecil atau menormalisasi dengan regex
Semantik huruf besar/kecil dan encoding pada komponen berbeda-beda. Mengubah seluruh string menjadi huruf kecil dapat merusak path dan tanda tangan, sementara regex yang luas dapat melintasi pemisah atau melewatkan aturan pencarian.
Pertanyaan Lanjutan dan Tanggapan
Bagaimana cara mencegah baseURL pengembangan sampai ke produksi?
Sisipkan baseURL sebagai konfigurasi deployment, validasi protokol dan host yang diizinkan saat startup, dan tetapkan domain produksi dalam pengujian build serta end-to-end. Jangan pernah menurunkan basis matcher keamanan dari URL yang dikendalikan pengguna.
Bagaimana Anda mendukung ekstensi file opsional?
Gunakan grup opsional dari sintaks pola dan uji ekstensi, tanpa ekstensi, titik ekstra, serta karakter yang di-encode secara terpisah. Jika capture tidak ada, pilih tipe konten dan kebijakan cache yang eksplisit.
Bagaimana URLPattern dapat berdampingan dengan pustaka perutean (routing)?
Biarkan URLPattern melakukan pemfilteran cepat di edge atau Service Worker, dan biarkan router aplikasi melakukan navigasi penuh serta validasi parameter. Bagikan pengujian kontrak URL sehingga kedua lapisan menginterpretasikan rute secara identik.