User Safety: Safe—Arsitektur Teknis agar Status “Aman” Tidak Hanya Stiker di Atas Payung Bocor
User Safety: safe sering terdengar seperti tombol ajaib: ditekan sekali, lampu hijau menyala, semua orang selamat, server bernyanyi lagu kebangsaan, lalu tukang parkir di sudut jalan memberi tepuk tangan. Kenyataannya tidak begitu. Dalam rekayasa produk, safe bukan warna, bukan slogan, dan bukan stiker “lolos质检” yang ditempel pada aplikasi yang masih menyimpan data lokasi pengguna di dalam kotak kardus terbuka. User Safety adalah keadaan yang harus dibuktikan melalui data, konteks, waktu, kontrol, dan kemampuan sistem untuk mengakui ketika ia tidak tahu.
Dalam konteks yang diberikan, ringkasan hasil pencarian menyebut bahwa pada 10 September front dingin membawa hujan lebat ke Vietnam Utara, hujan lebat terus mengguyur Jepang, serta terdapat imbauan yang dikutip berasal dari BMKG agar nelayan waspada terhadap gelombang tinggi di Teluk Bone dan perairan Baubau. Klaim-klaim cuaca tersebut saya perlakukan sebagai bahan kontekstual dari Vietnam.vn/Google News RSS, Vietnam.vn/Google News RSS, dan Antara News/Google News RSS. Karena tautan tersebut merupakan pintu masuk informasi, bukan sensor meteorologi yang dipasang di ruang kontrol kita, produk keselamatan pengguna tetap harus memverifikasi sumber, waktu berlaku, wilayah, dan tingkat keyakinan sebelum mengubahnya menjadi peringatan.
Artikel ini membahas rancangan teknis user safety, keamanan pengguna, penilaian risiko, sistem peringatan dini, integritas data, privasi lokasi, aksesibilitas, ketahanan operasional, dan tata kelola insiden. Ini bukan pengganti arahan otoritas setempat atau layanan darurat. Kalau sistem hanya berkata “aman” tanpa menjelaskan aman untuk siapa, di mana, sampai kapan, dan berdasarkan data apa, berarti sistem tersebut sedang bermain petak umpet dengan nyawa pengguna—dan permainan itu tidak lucu, kecuali bagi server yang tidak punya hati.
1. “Safe” Adalah Status Bersyarat, Bukan Lampu Hijau Ajaib
Kesalahan paling umum dalam produk keselamatan adalah mengubah konsep yang kompleks menjadi satu nilai boolean: true berarti aman, false berarti berbahaya. Model seperti itu terlalu kasar. Seorang pengguna dapat berada di wilayah yang sedang menerima peringatan hujan lebat, tetapi berada di dalam bangunan yang aman; pengguna lain dapat berada di luar wilayah peringatan, tetapi menempuh rute yang melintasi area berisiko. Dua orang dengan koordinat berbeda, aktivitas berbeda, dan waktu berbeda tidak boleh diperlakukan seolah-olah mereka dua butir kacang yang digoreng dalam wajan yang sama.
Dalam rancangan teknis, status keselamatan sebaiknya dipandang sebagai fungsi bersyarat:
safe = f(bahaya, paparan, kerentanan, waktu, kontrol, kepercayaan_data, sisa_risiko)
Artinya, antarmuka tidak cukup menampilkan kata safe. Ia perlu mengetahui ruang lingkup status tersebut. “Aman” untuk perjalanan darat belum tentu aman untuk aktivitas laut. “Aman” pada pukul 08.00 belum tentu tetap aman pada pukul 14.00. “Aman” berdasarkan data yang diperbarui lima menit lalu berbeda dari “aman” berdasarkan data yang sudah tertahan sejak kemarin dan mungkin sedang tidur siang di gudang.
| Dimensi | Pertanyaan teknis | Contoh kontrol |
|---|---|---|
| Bahaya | Apa jenis kejadian atau kondisi yang dinilai? | Kategori hujan lebat, gelombang tinggi, atau bahaya lain yang terverifikasi. |
| Paparan | Apakah pengguna benar-benar berada di area atau rute yang relevan? | Pencocokan geospasial, buffer ketidakpastian, dan validasi lokasi. |
| Kerentanan | Apakah aktivitas atau kebutuhan pengguna meningkatkan konsekuensi? | Preferensi yang diberikan pengguna, profil aksesibilitas, dan konteks aktivitas. |
| Dampak | Seberapa serius konsekuensinya jika peringatan terlewat? | Tier eskalasi, prioritas notifikasi, dan tinjauan manusia. |
| Umur data | Apakah informasi masih berlaku? | Timestamp, TTL, status stale, dan mekanisme pembaruan. |
| Kepercayaan data | Seberapa kuat sumber dan konsistensi informasinya? | Provenance, tanda tangan, validasi schema, dan rekonsiliasi sumber. |
| Kontrol | Apa tindakan yang dapat dilakukan pengguna? | Instruksi yang dapat ditindaklanjuti, kanal alternatif, dan tautan resmi. |
| Sisa risiko | Apa yang masih belum diketahui setelah kontrol diterapkan? | Label ketidakpastian, peringatan residual, dan jalur eskalasi. |
Dengan model ini, status safe tidak lagi menjadi klaim mutlak. Ia menjadi pernyataan yang dapat diaudit: sistem mengetahui sumber datanya, wilayah yang dinilai, waktu berlaku, tingkat keyakinan, tindakan yang direkomendasikan, serta risiko yang masih tersisa. Kalau tidak bisa menjawab pertanyaan-pertanyaan itu, lebih jujur menampilkan “status tidak dapat dipastikan” daripada menyuruh pengguna tersenyum pada lampu hijau yang ternyata lampu hias warung kopi.
2. Model Ancaman untuk User Safety
Sebelum menulis satu baris kode peringatan, tim harus membuat model ancaman. Model ancaman bukan dokumen dekoratif yang disimpan di wiki lalu dibiarkan berdebu sampai ada insiden. Ia adalah daftar cara sistem dapat gagal, cara data dapat menyesatkan, cara penyerang dapat menyalahgunakan kepercayaan, dan cara pengguna dapat salah memahami antarmuka. Dalam bahasa Wong Edan: kita tidak menunggu atap bocor lalu rapat membahas keindahan ember.
Model ancaman minimum untuk produk keselamatan pengguna mencakup aset berikut:
- Keselamatan fisik pengguna. Ini adalah aset utama. Semua keputusan teknis harus dinilai dari dampaknya terhadap kemampuan pengguna mengenali dan merespons bahaya.
- Data lokasi dan aktivitas. Data ini sangat sensitif karena dapat mengungkapkan keberadaan, kebiasaan, rute, dan pola hidup seseorang.
- Integritas pesan peringatan. Pesan yang diubah, dipalsukan, atau dikirim ulang dapat menciptakan kepanikan atau justru membuat pengguna mengabaikan bahaya.
- Ketersediaan layanan. Sistem yang mati tepat ketika peringatan dibutuhkan tidak cukup diselamatkan dengan halaman error yang sopan.
- Kepercayaan pengguna. Terlalu banyak alarm palsu dapat membuat pengguna mengabaikan alarm yang benar; terlalu sedikit alarm dapat membuat pengguna tidak menyadari risiko.
- Akuntabilitas operator. Setiap perubahan kebijakan, sumber data, ambang batas, atau penundaan notifikasi harus dapat ditelusuri.
| Skenario kegagalan | Dampak terhadap user safety | Kontrol yang disarankan |
|---|---|---|
| Data cuaca sudah basi | Pengguna menerima status yang tidak lagi mencerminkan kondisi terkini. | Timestamp penerimaan, waktu berlaku, TTL, label stale, dan fallback ke sumber alternatif. |
| Poligon wilayah salah | Pengguna di luar area mendapat alarm, sementara pengguna di dalam area tidak mendapat alarm. | Validasi geometri, pengujian titik batas, buffer ketidakpastian, dan pembaruan basis wilayah. |
| Sumber saling bertentangan | Sistem menyembunyikan konflik atau memilih satu sumber tanpa penjelasan. | Simpan semua versi, tampilkan provenance, gunakan aturan rekonsiliasi, dan eskalasi ke operator. |
| Alert dipalsukan | Pengguna diarahkan ke tindakan berbahaya atau ke tautan phishing. | Autentikasi sumber, tanda tangan pesan, validasi domain, dan larangan tindakan sensitif hanya dari notifikasi. |
| Notifikasi berlebihan | Terjadi kelelahan peringatan dan pengguna menonaktifkan kanal. | Deduplikasi, pengelompokan, priorisasi, batas frekuensi, dan pengaturan preferensi. |
| Lokasi bocor melalui log | Riwayat pergerakan pengguna dapat disalahgunakan. | Minimisasi data, redaksi log, enkripsi, retensi terbatas, dan kontrol akses. |
| Layanan tidak tersedia | Pengguna tidak menerima informasi saat最需要kannya. | Antrean tahan gagal, replikasi, mode degradasi, kanal cadangan, dan latihan insiden. |
| Automasi terlalu percaya diri | Operator atau pengguna mengikuti keputusan sistem tanpa mempertanyakan ketidakpastian. | Tampilkan confidence, sediakan penjelasan, dan gunakan human-in-the-loop untuk dampak tinggi. |
Untuk memprioritaskan skenario, tim dapat memakai skor heuristik, misalnya:
prioritas = dampak × paparan × kerentanan × urgensi × penyesuaian_kepercayaan
Rumus ini bukan hukum alam dan tidak boleh dianggap sebagai kalkulator takdir. Nilainya harus dikalibrasi dengan kebijakan produk, bukti operasional, dan tinjauan manusia. Yang lebih penting daripada angka cantik adalah konsistensi: jika dua kejadian memiliki data yang sama, sistem tidak boleh memperlakukan satu sebagai darurat dan lainnya sebagai pengumuman arisan, kecuali ada alasan yang tercatat.
3. Pipeline Data: Dari Sumber Berita hingga Status yang Dapat Dipertanggungjawabkan
Produk user safety memerlukan pipeline data yang memisahkan “informasi masuk” dari “kebenaran yang sudah diverifikasi”. Alur yang sehat biasanya terdiri dari ingest, autentikasi sumber, normalisasi, validasi, enrich, deduplikasi, penilaian risiko, penerbitan, penyimpanan bukti, dan umpan balik. Setiap tahap harus memiliki identitas data, waktu, status kualitas, dan jalur kegagalan.
- Ingest. Terima data dari API, feed, operator, atau kanal resmi melalui adapter yang terisolasi. Jangan mengizinkan sumber eksternal menulis langsung ke tabel keputusan tanpa validasi.
- Provenance. Simpan siapa pengirim, URL atau identifier sumber, waktu pengambilan, versi feed, dan tanda tangan jika tersedia. Tanpa provenance, tim tidak dapat membedakan peringatan resmi dari salinan yang sudah melewati lima grup obrolan dan satu tukang kopi.
- Normalisasi. Ubah format sumber menjadi schema internal yang konsisten. Untuk pertukaran pesan peringatan, tim dapat mempertimbangkan Common Alerting Protocol 1.2 dari OASIS, yang menyediakan elemen seperti identifier, sender, waktu, status, jenis pesan, kategori, urgensi, severitas, certainty, dan area. Penggunaan format bersama tidak otomatis membuat data benar, tetapi memudahkan validasi dan interoperabilitas.
- Validasi schema. Tolak atau karantina record yang tidak memiliki waktu berlaku, wilayah, kategori, atau sumber. Field yang hilang tidak boleh diam-diam diisi dengan nilai “aman”.
- Normalisasi geospasial. Ubah batas administratif, poligon bahaya, dan rute menjadi representasi yang konsisten. RFC 7946 tentang GeoJSON dapat menjadi acuan pertukaran geometri, tetapi tim tetap harus menguji interpretasi koordinat, presisi, dan batas wilayah.
- Validasi waktu. Bedakan waktu sumber, waktu penerimaan, waktu pemrosesan, waktu berlaku, dan waktu kedaluwarsa. Gunakan timestamp yang memiliki zona waktu dan jangan mengandalkan waktu lokal server seolah-olah server tidak pernah bepergian.
- Deduplikasi. Gabungkan pesan yang merujuk kejadian sama, tetapi jangan menghapus perbedaan penting. Dua peringatan dengan wilayah tumpang tindih dapat menjadi bukti penguat; dua peringatan yang saling bertentangan harus tetap disimpan sebagai konflik.
- Enrichment. Tambahkan metadata wilayah, kanal komunikasi, preferensi pengguna yang sah, dan konteks aktivitas. Enrichment tidak boleh mengubah fakta sumber menjadi fakta baru tanpa menandai bahwa itu merupakan inferensi.
- Penilaian risiko. Jalankan aturan atau model yang telah diuji terhadap data yang sudah dinormalisasi. Catat versi aturan, input yang relevan, dan alasan keputusan agar hasil dapat diaudit.
- Publikasi. Kirim pesan melalui kanal yang sesuai, lengkap dengan sumber, waktu pembaruan, tingkat keyakinan, dan tindakan. Simpan salinan pesan yang benar-benar dikirim, bukan hanya salinan yang ada di database sebelum antrean gagal.
- Arsip dan umpan balik. Simpan bukti keputusan sesuai kebijakan retensi, tangani koreksi, dan gunakan laporan pengguna untuk memperbaiki kualitas tanpa mengubah riwayat secara diam-diam.
Contoh object internal berikut hanya ilustrasi schema, bukan laporan kejadian nyata:
{
"event_id": "ilustrasi-001",
"hazard": "heavy_rain",
"area_geometry": "POLYGON_OR_FEATURE_ID",
"valid_from": "WAKTU_BERLAKU",
"valid_until": "WAKTU_KEDALUWARSA",
"source": {
"publisher": "NAMA_SUMBER",
"url": "TAUTAN_SUMBER",
"retrieved_at": "WAKTU_PENGAMBILAN",
"confidence": "RENDAH_SEDANG_TINGGI"
},
"actions": ["PERIKSA_SUMBER_RESMI", "IKUTI_ARAHAN_SETmpAT"]
}
Dalam konteks cuaca yang disebutkan sebelumnya, front dingin dan hujan lebat di Vietnam Utara, hujan lebat di Jepang, serta imbauan gelombang tinggi di Teluk Bone dan perairan Baubau harus diperlakukan sebagai event dengan wilayah dan waktu tersendiri. Jangan menyimpulkan bahwa seluruh Vietnam, seluruh Jepang, atau seluruh Sulawesi berada dalam kondisi yang sama hanya karena satu judul berita menyebut wilayah tertentu. Pencocokan harus dilakukan pada level area, waktu, dan aktivitas pengguna.
Prinsip terpenting: tidak ada data bukan berarti aman. Status yang benar untuk feed yang terputus adalah unknown, stale, atau unverified, bukan safe. Menempatkan lampu hijau pada kekosongan data sama cerdiknya dengan memakai payung berlubang lalu berkata bahwa hujan belum ada karena kepala sudah basah.
4. Risk Engine dan Kebijakan Peringatan
Risk engine adalah tempat konteks bertemu keputusan. Ia menerima event yang sudah dinormalisasi, mencocokkannya dengan lokasi atau rute pengguna, mempertimbangkan aktivitas dan preferensi yang sah, lalu menentukan apakah tidak ada tindakan, advisory, peringatan, atau eskalasi diperlukan. Risk engine sebaiknya deterministik untuk aturan keselamatan kritis: dengan input dan versi aturan yang sama, hasilnya harus sama. Jika hasilnya berubah tanpa alasan yang tercatat, tim sedang membangun mesin ramal, bukan sistem keselamatan.
Pencocokan geospasial tidak boleh hanya menggunakan jarak garis lurus yang kasar. Pertimbangkan:
- Point-in-polygon untuk mengetahui apakah titik pengguna berada di dalam area peringatan.
- Route intersection untuk pengguna yang akan melintasi area, bukan hanya pengguna yang sedang berada di sana.
- Buffer ketidakpastian di sekitar batas poligon agar pengguna dekat garis batas tidak jatuh ke dalam keputusan biner yang rapuh.
- Validasi koordinat untuk menolak titik yang berada di luar rentang sah, terbalik antara lintang dan bujur, atau berasal dari sumber yang tidak dipercaya.
- Presisi lokasi yang sesuai dengan tujuan. Jangan meminta koordinat sangat tepat jika peringatan dapat diberikan berdasarkan wilayah yang lebih kasar.
Contoh kebijakan berikut bersifat ilustratif dan harus dikalibrasi oleh pemilik produk serta otoritas terkait:
| Kondisi | Tindakan sistem | Alasan |
|---|---|---|
| Event segar, sumber tepercaya, confidence tinggi, pengguna berada di area | Peringatan menonjol, kanal alternatif, dan tindakan yang dapat segera dilakukan. | Paparan dan urgensi tinggi. |
| Event segar, tetapi pengguna berada dekat batas area | Advisory dengan peta, jarak, waktu berlaku, dan opsi melihat detail. | Mengurangi false negative tanpa menyembunyikan ketidakpastian. |
| Event sudah melewati waktu berlaku | Tandai stale, jangan sebut aman, dan cari sumber pembaruan. | Data lama tidak membuktikan kondisi sekarang. |
| Dua sumber memberi informasi berbeda | Tampilkan provenance, gunakan aturan konflik, dan eskalasi jika dampaknya tinggi. | Menyembunyikan konflik justru merusak kepercayaan. |
| Tidak ada event untuk wilayah pengguna | Tampilkan cakupan data dan waktu pembaruan terakhir, bukan klaim aman mutlak. | Ketiadaan alert dapat berarti tidak ada kejadian atau berarti sistem belum menerima data. |
Peringatan yang baik harus memiliki prioritas, tetapi prioritas bukan berarti semua notifikasi harus berteriak seperti sirine kebakaran di dalam lift. Gunakan tingkatan: informasi, advisory, warning, emergency. Batasi frekuensi, gabungkan event yang sama, dan beri pengguna kontrol atas kanal yang tidak kritis. Namun, kontrol pengguna tidak boleh dipakai sebagai alasan untuk menyembunyikan peringatan berisiko tinggi yang menjadi tanggung jawab penyedia layanan.
Untuk keputusan dengan konsekuensi besar, terapkan human-in-the-loop. Operator perlu melihat sumber, waktu, wilayah, confidence, konflik, dan alasan rekomendasi. Jangan meminta operator menekan tombol “setuju” pada kotak hitam yang tidak bisa dijelaskan. Dalam keselamatan pengguna, tombol setuju bukan mantra; ia adalah tanggung jawab yang dapat dilacak.
5. UX, Aksesibilitas, dan Komunikasi yang Dapat Ditindaklanjuti
Notifikasi keselamatan bukan tempat untuk puitisasi berlebihan. Pengguna yang sedang khawatir tidak perlu membaca metafora tentang awan yang sedang marah selama tiga paragraf. Ia perlu tahu apa yang terjadi, di mana, kapan, seberapa mendesak, apa yang sebaiknya dilakukan, dari mana informasi berasal, dan kapan informasi terakhir diperbarui.
Struktur pesan minimum dapat mengikuti pola berikut:
- Jenis bahaya: hujan lebat, gelombang tinggi, atau kategori lain yang jelas.
- Wilayah: nama area yang dapat dikenali, bukan hanya kode internal.
- Waktu berlaku: mulai, akhir, dan waktu pembaruan.
- Tingkat urgensi: informasi, advisory, warning, atau emergency.
- Aksi: instruksi yang realistis dan tidak bertentangan dengan arahan resmi.
- Sumber: penerbit atau otoritas yang menjadi rujukan.
- Ketidakpastian: label stale, confidence rendah, atau konflik sumber jika ada.
Contoh pesan yang buruk:
Status: safe.
Pesan itu tidak menjawab pertanyaan apa pun. Aman dari apa? Aman di mana? Aman sampai kapan? Berdasarkan data siapa? Apakah pengguna sedang berdiri di bawah pohon, berada di perahu, atau hanya sedang menunggu ojek online? Stiker hijau seperti ini membuat pengguna merasa aman karena sistem merasa malas menjelaskan.
Contoh pesan yang lebih bertanggung jawab, dengan tempat_holder yang harus diisi data nyata:
Peringatan [jenis bahaya] untuk [area]. Berlaku [waktu]. [Tingkat urgensi]. Periksa sumber resmi, ikuti arahan setempat, dan perbarui informasi sebelum melakukan aktivitas. Diperbarui [waktu].
Untuk konteks maritim, pesan yang merujuk Teluk Bone atau perairan Baubau harus membedakan pengguna yang memang beraktivitas di perairan tersebut dari pengguna yang hanya membaca berita di darat. Untuk konteks hujan lebat di Vietnam Utara atau Jepang, sistem perlu membedakan wilayah yang tercakup, waktu berlaku, dan kanal informasi resmi. Ini bukan soal menambahkan banyak kata; ini soal mencegah generalisasi yang berbahaya.
Apakah “tidak ada notifikasi” berarti aman?
Tidak. Tidak ada notifikasi dapat berarti tidak ada event yang terdeteksi, feed belum tiba, wilayah belum tercakup, lokasi pengguna tidak tersedia, atau aturan belum dieksekusi. Antarmuka sebaiknya menampilkan status cakupan seperti “data terakhir diterima pukul …” dan “wilayah ini belum memiliki sumber aktif”, bukan membiarkan pengguna menebak bahwa kesunyian adalah kabar baik.
Prinsip aksesibilitas
WCAG 2.2 dapat dijadikan acuan untuk merancang antarmuka yang lebih dapat diakses. Terapkan hal-hal berikut:
- Gunakan teks yang dapat dibaca oleh screen reader; jangan menjadikan warna sebagai satu-satunya pembawa makna.
- Sediakan kontras yang cukup, ukuran teks yang dapat disesuaikan, fokus keyboard yang jelas, dan label formulir yang benar.
- Jangan mengandalkan animasi berkedip atau gerakan untuk menyampaikan urgensi.
- Sediakan transkrip atau alternatif teks untuk konten audio dan video.
- Gunakan bahasa sederhana, kalimat pendek, dan istilah yang konsisten.
- Dukung bahasa dan kebutuhan lokal pengguna tanpa menerjemahkan istilah keselamatan secara sembarangan.
- Uji dengan pengguna yang memakai teknologi bantu, koneksi lambat, perangkat lama, dan kondisi stres.
- Berikan opsi notifikasi alternatif, tetapi jangan menyembunyikan peringatan penting di dalam menu yang harus dibuka tujuh kali seperti harta karun.
Aksesibilitas adalah bagian dari keselamatan, bukan fitur bonus. Pengguna yang tidak dapat melihat warna, mendengar audio, mengetik dengan cepat, atau memahami bahasa antarmuka tetap berhak memperoleh informasi yang sama pentingnya. Kalau sistem hanya aman bagi pengguna dengan perangkat terbaru, mata sempurna, kuota melimpah, dan waktu luang untuk membaca dashboard, maka sistem itu belum aman; ia hanya terlihat rapi di slide presentasi.
6. Keamanan, Privasi, dan Ketahanan Operasional
User safety tidak dapat dipisahkan dari security. Sistem yang mudah ditembus dapat menyebarkan peringatan palsu, mencuri lokasi, mematikan notifikasi, atau membuat pengguna percaya pada tautan berbahaya. Sebaliknya, sistem yang sangat aman tetapi tidak tersedia saat dibutuhkan juga gagal memenuhi tujuan keselamatan. Kita perlu keamanan yang melindungi tanpa membuat proses peringatan tersendat seperti sepeda ontel di jalan berlubang.
Keamanan identitas dan otorisasi
- Gunakan autentikasi kuat untuk operator, administrator, dan sumber data.
- Terapkan least privilege: petugas lapangan tidak perlu akses ke seluruh data pengguna, dan model risiko tidak perlu hak administrator database.
- Pisahkan lingkungan produksi, staging, dan pengembangan. Data nyata tidak boleh dipakai untuk eksperimen seolah-olah itu mainan anak.
- Gunakan role-based atau attribute-based access control sesuai kompleksitas organisasi.
- Catat perubahan kebijakan, sumber, ambang batas, dan penekanan tombol eskalasi dalam audit log yang terlindungi.
OWASP Application Security Verification Standard dapat dipakai sebagai daftar periksa kontrol keamanan aplikasi. Untuk komunikasi antar layanan, gunakan protokol terenkripsi yang sesuai; misalnya RFC 8446 sebagai rujukan TLS 1.3. Enkripsi tidak menyelesaikan semua masalah, tetapi membiarkan data lokasi dan pesan peringatan bergerak dalam bentuk yang mudah dibaca orang asing adalah undangan terbuka yang kurang sopan.
Integritas pesan dan pencegahan pemalsuan
Setiap pesan keselamatan perlu identitas unik, timestamp, sumber, dan mekanisme pencegahan replay. Jika format mendukung tanda tangan atau rantai kepercayaan, manfaatkan. Validasi domain, sertifikat, token, dan struktur pesan sebelum memproses konten. Jangan menjalankan kode, membuka URL berbahaya, atau mengikuti instruksi sensitif hanya karena payload terlihat meyakinkan. Penyerang tidak perlu membuat badai; mereka cukup membuat pengguna percaya bahwa badai berasal dari tautan mereka.
Privasi lokasi
Lokasi adalah data yang dapat membahayakan pengguna jika bocor. Terapkan minimisasi data: gunakan wilayah kasar jika cukup, proses pencocokan di perangkat bila memungkinkan, batasi retensi, dan hapus data sesuai kebijakan yang telah ditetapkan. Redaksi log agar koordinat, identifier perangkat, dan rute tidak tersebar ke layanan monitoring. Batasi siapa yang dapat melihat riwayat lokasi, dan jangan menjual atau memakai data keselamatan untuk iklan tanpa dasar yang sah dan transparan. Pengguna memberikan lokasi agar sistem membantu, bukan agar profilnya dijadikan souvenir digital.
Ketahanan saat sumber atau jaringan gagal
_pipeline_ harus tahan terhadap kegagalan sebagian. Gunakan antrean, idempotency key, retry dengan backoff, circuit breaker, replikasi, dan mode degradasi. Jika satu sumber tidak tersedia, sistem dapat menampilkan data terakhir dengan label stale, meminta operator memverifikasi, atau mengalihkan ke sumber cadangan yang telah disetujui. Jangan mengganti data yang hilang dengan asumsi “semua aman”. Mode degradasi yang jujur lebih baik daripada kebohongan yang terlihat cepat.
Siapkan runbook insiden yang menjelaskan cara mendeteksi, menganalisis, membatasi, mengomunikasikan, memulihkan, dan mempelajari kejadian. NIST SP 800-61 Rev. 2 dapat menjadi rujukan untuk penanganan insiden keamanan komputer. Runbook harus mencakup skenario pesan palsu, feed terlambat, kesalahan geofence, lonjakan notifikasi, kebocoran data, dan kegagalan kanal utama. Latihan tidak perlu menunggu bencana; lakukan tabletop exercise sebelum sistem benar-benar panik dan semua orang saling bertanya siapa yang memegang kunci dashboard.
7. Pengujian, Observabilitas, dan Tata Kelola
Sistem user safety tidak cukup diuji dengan satu skenario bahagia di mana data datang tepat waktu, lokasi akurat, jaringan stabil, dan pengguna membaca semua teks dengan tenang. Uji justru harus dimulai dari kondisi menyebalkan: data terlambat, koordinat melompat, sumber bertentangan, pengguna menolak izin lokasi, perangkat dalam mode hemat daya, layar kecil, koneksi EDGE, dan operator sedang menghadapi sepuluh event sekaligus.
| Skenario pengujian | Hasil yang diharapkan |
|---|---|
| Event hujan lebat dengan wilayah dan waktu jelas | Event dinormalisasi, pengguna di area menerima pesan yang sesuai, dan provenance tersimpan. |
| Pengguna berada tepat di batas poligon | Sistem menerapkan buffer atau advisory, bukan keputusan acak akibat pembulatan koordinat. |
| Feed tidak memperbarui data melewati TTL | Status menjadi stale atau unknown; tidak muncul klaim safe. |
| Dua sumber memberikan informasi berbeda | Konflik disimpan, pesan tidak menyembunyikan sumber, dan aturan eskalasi berjalan. |
| Pesan replay atau sumber tidak terautentikasi | Pesan ditolak atau dikarantina tanpa memicu notifikasi pengguna. |
| Lokasi pengguna tidak tersedia | Sistem meminta izin atau menampilkan cakupan alternatif tanpa menebak posisi secara diam-diam. |
| Kanal push gagal | Sistem mencoba kanal cadangan sesuai kebijakan dan mencatat kegagalan pengiriman. |
| Antarmuka dibuka dengan screen reader atau kontras rendah | Informasi urgensi tetap dapat dipahami tanpa bergantung pada warna atau gestur saja. |
Gunakan beberapa lapisan pengujian: unit test untuk fungsi validasi, contract test untuk API sumber, property test untuk geospatial, integration test untuk antrean dan kanal, accessibility test untuk antarmuka, load test untuk lonjakan event, chaos test untuk kegagalan dependen, serta red-team exercise untuk upaya pemalsuan dan penyalahgunaan. Uji historis atau skenario simulasi dapat membantu menemukan celah, tetapi jangan menganggap simulasi sebagai bukti bahwa dunia nyata akan berperilaku rapi.
Observabilitas harus menjawab pertanyaan operasional, bukan hanya menampilkan grafik yang terlihat seperti lukisan abstrak. Pantau metrik berikut:
- Waktu dari penerimaan sumber hingga event ternormalisasi.
- Persentase event yang memiliki provenance lengkap.
- Jumlah event stale, event tanpa waktu berlaku, dan event yang gagal validasi.
- Waktu dari keputusan risiko hingga pesan benar-benar dikirim.
- Tingkat keberhasilan pengiriman per kanal.
- Jumlah duplikasi, konflik sumber, dan eskalasi operator.
- Frekuensi notifikasi per pengguna dan tingkat penonaktifan kanal.
- Latensi kueri geospasial dan persentase pencocokan yang gagal.
- Insiden privasi, akses tidak sah, dan perubahan kebijakan yang tidak teraudit.
- Waktu pemulihan setelah kegagalan sumber atau infrastruktur.
Tentukan SLO dan ambang batas secara eksplisit. Jangan menulis “sistem harus cepat” lalu menganggap semua orang membaca kata “cepat” dengan rasa yang sama. Tetapkan target yang dapat diukur, misalnya waktu pemrosesan, ketersediaan kanal, atau batas usia data, lalu uji apakah target tersebut realistis saat beban tinggi. Jika target tidak dapat dipenuhi, jangan menyembunyikannya di bawah karpet; ubah arsitektur, kurangi cakupan, atau komunikasikan keterbatasan.
Tata kelola yang baik memerlukan pemilik keputusan. Setiap aturan harus memiliki pemilik, tanggal review, alasan perubahan, dan mekanisme penonaktifan. Sumber data perlu ditinjau ulang secara berkala. Model atau skor risiko perlu dibandingkan dengan hasil operasional tanpa mengubah data historis agar terlihat lebih pintar. Pengguna perlu memiliki kanal untuk melaporkan pesan salah, meminta koreksi, atau menonaktifkan kanal tertentu. Feedback bukan musuh sistem; feedback adalah orang yang mengetuk pintu sambil membawa fakta bahwa rumah sedang bocor.
Sebelum merilis fitur User Safety: safe, gunakan daftar periksa minimum berikut:
- Apakah setiap status aman memiliki wilayah, waktu, sumber, dan tingkat keyakinan?
- Apakah data stale ditampilkan sebagai stale, bukan aman?
- Apakah pengguna di batas wilayah diperlakukan dengan ketidakpastian yang masuk akal?
- Apakah pesan memuat tindakan yang dapat ditindaklanjuti?
- Apakah sumber dan waktu pembaruan dapat dilihat pengguna?
- Apakah pesan dapat diakses tanpa bergantung pada warna, suara, atau gerakan?
- Apakah lokasi pengguna diminimalkan, dilindungi, dan memiliki retensi jelas?
- Apakah sumber pesan diautentikasi dan pesan replay dapat ditolak?
- Apakah ada kanal cadangan ketika push notification gagal?
- Apakah operator dapat menjelaskan mengapa suatu peringatan dikirim?
- Apakah ada runbook untuk data palsu, data terlambat, dan kebocoran lokasi?
- Apakah tim secara berkala menguji skenario terburuk, bukan hanya skenario demo?
Kesimpulan Ahli: Safe Adalah Proses, Bukan Stiker
User Safety: safe baru bermakna apabila sistem mampu menjelaskan batas klaimnya. Aman untuk wilayah mana? Aman pada waktu apa? Berdasarkan sumber apa? Apa yang terjadi jika data terlambat? Apa yang harus dilakukan pengguna? Siapa yang bertanggung jawab ketika aturan berubah? Jika jawaban atas pertanyaan-pertanyaan ini tidak tersedia, kata “safe” hanyalah dekorasi antarmuka yang berpura-pura menjadi kebijakan keselamatan.
Konteks cuaca yang disebutkan—hujan lebat di Vietnam Utara, hujan lebat di Jepang, serta imbauan gelombang tinggi di Teluk Bone dan perairan Baubau—menunjukkan mengapa presisi konteks sangat penting. Bahaya, wilayah, waktu, aktivitas pengguna, dan kualitas sumber harus diproses secara terpisah sebelum digabungkan menjadi keputusan. Berita dapat menjadi pemicu investigasi, tetapi tidak boleh langsung menjadi perintah otomatis tanpa verifikasi dan tata kelola.
Arsitektur yang bertanggung jawab memakai pipeline data yang dapat diaudit, risk engine yang dapat dijelaskan, UX yang dapat ditindaklanjuti, aksesibilitas yang inklusif, keamanan yang melindungi identitas dan integritas, privasi yang meminimalkan paparan lokasi, serta pengujian yang sengaja mencari kegagalan. Dengan begitu, status aman menjadi hasil dari kontrol yang terus diperbarui, bukan tebakan yang dibungkus warna hijau.
Jadi, kalau suatu produk menampilkan safe, mintalah scope, timestamp, source, confidence, dan residual risk. Kalau produk hanya menjawab “pokoknya aman”, jangan percaya terlalu cepat. Payung boleh bocor, server boleh kadang edan, tetapi pengguna tidak seharusnya disuruh berteduh di bawah dashboard yang tidak tahu arah hujan.