Topik wawancara representatif

Wawancara Umum: Bagaimana cara aman membaca body sekali pakai dengan Request.bytes()?

UmumSedang
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Anda harus memproses body permintaan biner di browser atau edge runtime. Platform menambahkan Request.bytes(), tetapi body permintaan hanya dapat dikonsumsi satu kali. Jelaskan kapan menggunakannya, cara menghindari pembacaan ganda, cara membatasi memori, dan cara merancang fallback.

Perintah dan cakupan

Anda harus memproses body permintaan biner di browser atau edge runtime. Platform menambahkan Request.bytes(), tetapi body permintaan hanya dapat dikonsumsi satu kali. Jelaskan kapan menggunakannya, cara menghindari pembacaan ganda, cara membatasi memori, dan cara merancang fallback.

MDN menjelaskan Request.bytes() mengembalikan Promise yang nilai terpenuhinya adalah Uint8Array dari body permintaan; membaca body akan mengonsumsinya. Wawancara ini menguji masa pakai body Fetch, batas sumber daya, dan error daripada memperlakukan metode baru ini sebagai default universal.

Apa yang dievaluasi oleh pewawancara

  • Menjelaskan status used-body dan sifat saling eksklusif dari bytes(), arrayBuffer(), json(), dan text().
  • Memilih pembacaan lengkap versus streaming berdasarkan ukuran permintaan dan tujuan pemrosesan.
  • Menempatkan satu batasan baca di antara percobaan ulang (retry), logging, verifikasi tanda tangan, dan penguraian bisnis.
  • Merancang deteksi kapabilitas, batasan, pembatalan, batas waktu (timeout), dan pemetaan error.
  • Mencegah body mentah masuk ke dalam log, cache, atau objek lintas-tenant.

Pertanyaan klarifikasi

  • Berapa ukuran body, sumber, Content-Type, persyaratan tanda tangan, dan runtime target?
  • Apakah bisnis memerlukan array byte lengkap, hashing inkremental, unggahan chunk, atau data yang didekodekan?
  • Lapisan mana yang melakukan percobaan ulang, dan apakah replay aman?
  • Bisakah body berisi data pribadi, kredensial, atau data isolasi tenant?

Masa pakai body dan pemilihan API

Setelah Request.bytes() berhasil mengonsumsi body, panggilan json() atau text() berikutnya akan gagal, dan hal sebaliknya juga berlaku. Jika beberapa konsumen memerlukan data tersebut, baca sekali pada satu batas tunggal dan teruskan hasil yang terkontrol ke kode penguraian, verifikasi, dan bisnis. Jangan meneruskan objek Request melalui banyak modul yang bersaing untuk membacanya.

Pembacaan lengkap cocok untuk permintaan kecil yang terbatas atau protokol yang memerlukan validasi sekali jalan. Permintaan besar sebaiknya memilih streaming request.body, yang melakukan hashing inkremental dan pemeriksaan ukuran. Hasil Uint8Array memudahkan pemrosesan byte tetapi tidak menghilangkan lonjakan memori dari pembacaan lengkap.

Memori, batasan, dan backpressure

Periksa Content-Length di edge, tetapi jangan hanya mengandalkannya; dengan transfer chunked, hitung byte sebenarnya dan batalkan (abort) ketika batas terlampaui. Tetapkan batas tenant, rute, dan global untuk pembacaan lengkap sehingga permintaan konkuren tidak dapat mengalokasikan array tanpa batas. Jalur streaming menerapkan backpressure ketika konsumen tertinggal.

Untuk penerusan, jangan menyalin beberapa array penuh untuk logging atau percobaan ulang. Jika replay diperlukan, tulis byte dengan ukuran terbatas ke penyimpanan sementara yang terkontrol dengan pengikatan tenant, masa kedaluwarsa, dan digest; body mentah tidak boleh berada di log biasa.

Verifikasi tanda tangan, penguraian, dan error

Sebelum verifikasi, tentukan apakah tanda tangan mencakup byte mentah atau struktur kanonikal. Berikan byte mentah dari satu pembacaan tersebut ke pemverifikasi dan pengurai; serialisasi ulang JSON dapat mengubah spasi, urutan, atau pengodean. Petakan kegagalan penguraian, kegagalan tanda tangan, pelanggaran ukuran, pembatalan, dan batas waktu ke error bisnis yang berbeda, bukan satu respons "malformed".

Edge function mungkin mengekspos API body yang berbeda. Deteksi kapabilitas dan pilih bytes(), arrayBuffer(), atau streaming, dengan mencatat versi kapabilitas runtime saat startup. Fallback harus mempertahankan batasan, digest input, dan semantik error; runtime lama tidak boleh melemahkan keamanan secara diam-diam.

Pembatalan, batas waktu, dan replay

Teruskan AbortSignal ke pembacaan dan operasi downstream. Hentikan pembacaan dan lepaskan referensi ketika klien terputus atau batas waktu berakhir. Jangan pernah memutar ulang (replay) permintaan dengan efek samping secara otomatis setelah batas waktu tanpa kunci idempoten, deduplikasi server, dan jendela percobaan ulang yang eksplisit. Kueri yang tampak aman sekalipun memerlukan tinjauan kebocoran replay.

Percobaan ulang gateway dapat membuat salinan permintaan, sehingga verifikasi tanda tangan, kunci idempoten, dan event audit harus berbagi satu ID permintaan. Respons error harus menyatakan apakah percobaan ulang aman tanpa mengekspos status baca internal atau materi kunci.

Keamanan dan observabilitas

Batasi Content-Type, ukuran body, durasi baca, dan konkurensi. Perhitungkan ukuran setelah dekompresi untuk menahan decompression bomb. Isolasi cache dan objek sementara berdasarkan tenant; simpan byte sensitif hanya selama diperlukan. Catat jumlah byte, durasi, alasan pembatalan, kelas error, dan digest permintaan, jangan pernah kontennya.

Pantau kegagalan konsumsi body, pelanggaran batas, waktu baca p95, memori puncak, backpressure downstream, dan percobaan ulang. Jika kegagalan bytes() meningkat dalam satu runtime, beralihlah ke fallback yang teruji dan buat peringatan (alert); menangkap exception dan membaca body yang sama lagi bukanlah pemulihan.

Checklist validasi dan tindak lanjut

Uji kasus kosong, satu byte, mendekati batas, melebihi batas, chunked, klien lambat, terputus, pembacaan ganda, ketidakcocokan tanda tangan, decompression bomb, konkuren, fallback runtime lama, dan batas waktu downstream. Verifikasi bahwa setiap jalur mengonsumsi body tepat satu kali dan pembatalan menghentikan pembacaan lebih lanjut.

Mengapa tidak memanggil json() lalu menggunakan bytes() untuk verifikasi?

Pembacaan pertama telah mengonsumsi body, dan penguraian ditambah serialisasi ulang dapat mengubah spasi, urutan, atau pengodean. Baca byte mentah sekali dan berikan byte yang sama untuk verifikasi dan penguraian.

Kapan bytes() lebih disukai daripada streaming?

Gunakan untuk permintaan kecil yang terbatas ketika protokol memerlukan validasi byte lengkap. File besar, unggahan berkelanjutan, dan konkurensi tinggi memerlukan streaming dan pemrosesan inkremental.

Bagaimana Anda membuktikan bahwa fallback sama amannya?

Paksa setiap jalur kapabilitas di setiap runtime dan bandingkan batasan, digest, tanda tangan, error, pembatalan, dan event audit. Fallback tidak boleh mengubah kebijakan keamanan atau batasan percobaan ulang.

Sumber publik

Pertanyaan terkait