Tajuk HTTP untuk pengembang yang bertanggung jawab


Saat ini, online adalah kondisi umum bagi banyak orang. Kita semua membeli, berkomunikasi, membaca artikel, mencari informasi tentang berbagai topik. Jaringan menghubungkan kita dengan seluruh dunia, tetapi di atas semua itu, menghubungkan orang. Saya telah menggunakan Internet sendiri selama 20 tahun, dan hubungan saya dengannya berubah delapan tahun yang lalu ketika saya menjadi pengembang web.

Pengembang menghubungkan orang.
Pengembang membantu orang.
Pengembang memberi orang peluang.

Pengembang dapat membuat jaringan untuk semua orang, tetapi kemampuan ini harus digunakan secara bertanggung jawab. Pada akhirnya, penting untuk menciptakan hal-hal yang membantu orang dan memberdayakan mereka. Pada artikel ini saya ingin berbicara tentang bagaimana header HTTP dapat membantu Anda membuat produk yang lebih baik untuk pekerjaan terbaik semua pengguna di Internet.

HTTP - Protokol Transfer Hiperteks


Mari kita bicara tentang HTTP dulu. HTTP adalah protokol yang digunakan oleh komputer untuk meminta dan mengirim data melalui Internet.

Saat browser meminta sumber daya dari server, ia menggunakan HTTP. Permintaan ini mencakup serangkaian pasangan nilai kunci yang berisi informasi seperti versi peramban atau format file yang dipahami. Pasangan ini disebut header permintaan.

Server merespons dengan sumber daya yang diminta, tetapi juga mengirim header respons yang berisi informasi tentang sumber daya atau server itu sendiri.

Request: GET https://the-responsible.dev/ Accept: text/html,application/xhtml+xml,application/xml Accept-Encoding: gzip, deflate, br Accept-Language: en-GB,en-US;q=0.9,en;q=0.8,de;q=0.7 ... Response: Connection: keep-alive Content-Type: text/html; charset=utf-8 Date: Mon, 11 Mar 2019 12:59:38 GMT ... Response Body 

Saat ini, HTTP adalah fondasi Internet dan menawarkan banyak cara untuk mengoptimalkan pengalaman pengguna. Mari kita lihat bagaimana Anda dapat menggunakan header HTTP untuk membuat jaringan yang aman dan dapat diakses.

Jaringan harus aman


Dulu saya tidak pernah merasa dalam bahaya ketika saya mencari sesuatu di Internet. Tetapi semakin saya belajar tentang World Wide Web, semakin saya khawatir. Anda dapat membaca bagaimana peretas mengubah perpustakaan CDN global , situs acak menambang cryptocurrency di peramban pengunjung mereka, serta bagaimana, melalui rekayasa sosial, orang secara teratur mendapatkan akses ke proyek sumber terbuka yang sukses . Ini tidak baik. Tetapi mengapa Anda harus peduli?

Jika Anda mengembangkan untuk web hari ini, maka jangan hanya menulis kode. Saat ini, dalam pengembangan web, banyak orang bekerja di satu situs. Anda juga dapat menggunakan banyak sumber terbuka. Selain itu, untuk tujuan pemasaran, Anda dapat menyertakan beberapa skrip pihak ketiga. Ratusan orang menyediakan kode yang berjalan di situs Anda. Dan pengembang harus bekerja dalam realitas seperti itu.

Apakah semua orang ini dan semua kode sumber dapat dipercaya?

Saya tidak berpikir bahwa kode pihak ketiga harus dipercaya. Untungnya, ada cara untuk melindungi situs Anda dan membuatnya lebih aman. Selain itu, alat seperti helm dapat bermanfaat, misalnya, untuk aplikasi ekspres .

Jika Anda ingin menganalisis seberapa banyak kode pihak ketiga berjalan di situs Anda, Anda dapat melihat di panel pengembang atau mencoba Request Map Generator.

HTTPS dan HSTS - pastikan koneksi Anda aman


Koneksi yang aman adalah dasar dari internet yang aman. Tanpa permintaan terenkripsi yang melewati HTTPS , Anda tidak dapat memastikan bahwa tidak ada orang lain antara situs Anda dan pengunjung. Seseorang dapat dengan cepat mengatur jaringan Wi-Fi publik dan meluncurkan seorang pria dalam serangan tengah pada siapa saja yang terhubung ke jaringan ini . Seberapa sering Anda menggunakan Wi-Fi publik? Juga, seberapa sering Anda memeriksa apakah itu dapat dipercaya?

Untungnya, hari ini sertifikat TLS gratis ; HTTPS telah menjadi standar, dan browser menyediakan fitur-fitur canggih hanya untuk koneksi yang aman, dan bahkan menandai situs web non-HTTPS sebagai tidak aman, yang memfasilitasi implementasi protokol ini. Sayangnya, kita tidak selalu aman saat berada di Internet. Ketika seseorang ingin membuka situs, dia tidak memasukkan protokol ke bilah alamat (dan mengapa harus?). Ini menghasilkan permintaan HTTP yang tidak terenkripsi. Situs yang berjalan aman mengarahkan pengguna ke HTTPS. Tetapi bagaimana jika seseorang mencegat permintaan tidak aman pertama?

Anda dapat menggunakan header respons HSTS (HTTP Strict Transport Security) untuk memberi tahu browser bahwa situs Anda hanya berfungsi melalui HTTPS.

 Strict-Transport-Security: max-age=1000; includeSubDomains; preload 

Header ini memberi tahu browser bahwa Anda tidak ingin menggunakan permintaan HTTP, dan kemudian secara otomatis akan menerapkan permintaan yang sama ke sumber yang sama dengan koneksi yang aman. Jika Anda mencoba membuka URL yang sama melalui HTTP, browser akan kembali menggunakan HTTPS dan mengarahkan ulang pengguna.

Anda dapat mengkonfigurasi berapa lama opsi ini harus tetap aktif ( max-age dalam detik) jika Anda ingin menggunakan HTTP lagi nanti. Jika Anda ingin mengaktifkan subdomain, Anda dapat mengonfigurasi ini menggunakan includeSubDomains .

Jika Anda ingin melakukan segala yang mungkin sehingga browser tidak pernah meminta situs Anda melalui HTTP, Anda juga dapat mengatur pointer preload dan mengirim situs Anda ke daftar global. Jika konfigurasi HSTS situs Anda sesuai dengan usia minimum minimum satu tahun dan aktif untuk subdomain, itu dapat dimasukkan dalam daftar browser internal untuk situs yang hanya berfungsi melalui HTTPS.

Pernahkah Anda bertanya-tanya mengapa Anda tidak bisa lagi menggunakan variabel lingkungan lokal seperti my-site.dev di browser Anda melalui HTTP? Alasannya justru ada dalam daftar internal ini - .dev otomatis termasuk dalam daftar ini, karena pada bulan Februari 2019 itu menjadi domain tingkat atas nyata.

Header HSTS tidak hanya membuat situs Anda sedikit lebih aman, tetapi juga mempercepat kerjanya. Bayangkan seseorang mengakses koneksi seluler yang lambat. Jika permintaan pertama dibuat melalui HTTP hanya untuk menerima pengalihan, maka pengguna mungkin tidak melihat apa pun di layar selama beberapa detik. Dan dengan HSTS, Anda dapat menyimpan detik itu, dan browser akan secara otomatis menggunakan HTTPS.

CSP - dengan jelas menunjukkan apa yang diizinkan di situs Anda


Sekarang situs Anda berjalan melalui koneksi yang aman, Anda dapat mengalami masalah ketika browser mulai memblokir permintaan yang mencapai alamat tidak aman karena kebijakan konten campuran. Header Kebijakan Keamanan Konten (CSP) menawarkan cara hebat untuk menangani situasi ini. Anda dapat mengatur set aturan CSP Anda menggunakan elemen meta di HTML yang disediakan atau melalui header HTTP.

 Content-Security-Policy: upgrade-insecure-requests 

Pointer upgrade-insecure-requests menyebabkan browser untuk secara ajaib mengkonversi semua permintaan HTTP menjadi permintaan HTTPS.

Namun, CSP tidak terbatas pada protokol yang digunakan. Ini menawarkan cara terperinci untuk menentukan sumber daya dan kegiatan apa yang diizinkan di situs Anda. Anda dapat, misalnya, menentukan skrip mana yang harus dieksekusi atau dari mana Anda mengunduh gambar. Jika ada sesuatu yang tidak diizinkan, peramban memblokir tindakan ini dan mencegah kemungkinan serangan di situs Anda.



Pada saat penulisan, ada 24 opsi konfigurasi yang berbeda untuk CSP. Mulai dari skrip hingga style sheet hingga pekerja layanan.



Anda dapat menemukan ulasan lengkap tentang MDN.

Menggunakan CSP, Anda dapat menentukan apa yang harus dimasukkan situs Anda dan apa yang tidak.

 Content-Security-Policy: default-src 'self'; script-src 'self' just-comments.com www.google-analytics.com production-assets.codepen.io storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: images.contentful.com images.ctfassets.net www.gravatar.com www.google-analytics.com just-comments.com; font-src 'self' data:; connect-src 'self' cdn.contentful.com images.contentful.com videos.contentful.com images.ctfassets.net videos.ctfassets.net service.just-comments.com www.google-analytics.com; media-src 'self' videos.contentful.com videos.ctfassets.net; object-src 'self'; frame-src codepen.io; frame-ancestors 'self'; worker-src 'self'; block-all-mixed-content; manifest-src 'self' 'self'; disown-opener; prefetch-src 'self' 

Rangkaian aturan di atas adalah untuk situs pribadi saya, dan jika Anda berpikir bahwa contoh definisi CSP ini sangat rumit, maka Anda benar sekali. Saya menerapkan kit ini pada upaya ketiga saya, mengerahkan dan memutar kembali, karena itu merusak situs beberapa kali. Tetapi ada cara yang lebih baik.

Untuk menghindari peretasan situs Anda, CSP juga menyediakan mode pelaporan saja.

 Content-Security-Policy-Report-Only: default-src 'self'; ... report-uri https://stefanjudis.report-uri.com/r/d/csp/reportOnly 

Menggunakan mode Content-Security-Policy-Report-Only , browser hanya merekam sumber daya yang akan diblokir, bukannya benar-benar memblokirnya. Mekanisme pelaporan ini memungkinkan Anda untuk memverifikasi dan mengonfigurasi set aturan Anda.

Baik header, Content-Security-Policy dan Content-Security-Policy-Report-Only , juga menawarkan cara untuk menentukan titik akhir untuk mengirim report-uri pelanggaran dan mencatat informasi ( report-uri ). Anda dapat mengonfigurasi server log dan menggunakan informasi log yang dikirim untuk mengonfigurasi aturan CSP hingga siap dikirim.

Proses yang disarankan adalah sebagai berikut: jalankan CSP pertama dalam mode laporan, analisis pelanggaran yang masuk dengan lalu lintas nyata, dan hanya ketika tidak ada pelanggaran sumber daya terkontrol Anda terdeteksi, aktifkan.

Jika Anda mencari layanan yang dapat membantu Anda menangani majalah-majalah ini, saya sarankan Laporan URI , ini sangat membantu saya.

Implementasi umum CSP


Browser hari ini mendukung CSP dengan baik , tetapi sayangnya tidak banyak situs yang menggunakannya. Untuk melihat berapa banyak situs yang mengirimkan konten menggunakan CSP, saya mengirim permintaan ke HTTParchive dan menemukan bahwa hanya 6% situs yang dilihat menggunakan kebijakan ini. Saya pikir kita bisa membuat Internet lebih aman dan melindungi pengguna kita dari tanpa sengaja menambang cryptocurrency .



Jaringan harus dapat diakses.


Sementara saya menulis artikel ini, saya duduk di depan MacBook yang relatif baru menggunakan koneksi Wi-Fi rumah cepat. Pengembang sering lupa bahwa situasi ini tidak standar untuk sebagian besar pengguna kami. Orang yang mengunjungi situs kami menggunakan telepon lama dan koneksi yang meragukan. Situs berat dan padat dengan ratusan kueri meninggalkannya dengan kesan buruk.

Dan ini bukan hanya tentang kesan. Orang membayar jumlah yang berbeda untuk lalu lintas tergantung di mana mereka tinggal . Bayangkan Anda membuat situs web untuk rumah sakit. Informasi tentang itu bisa sangat penting dan menyelamatkan nyawa. Jika halaman di situs web rumah sakit berukuran 5 MB, maka itu tidak hanya akan bekerja lambat, tetapi mungkin terlalu mahal bagi mereka yang paling membutuhkannya. Harga lalu lintas lima megabyte di Eropa atau Amerika Serikat diabaikan dibandingkan dengan harga di Afrika. Pengembang bertanggung jawab untuk membuat halaman web dapat diakses oleh semua. Tanggung jawab ini termasuk menyediakan sumber daya yang tepat, memilih alat yang tepat (apakah Anda benar-benar membutuhkan kerangka kerja JS untuk pendaratan?) Dan menghindari permintaan.

Kontrol Cache - Hindari Permintaan Sumber Daya yang Tidak Berubah


Saat ini situs dapat berisi ratusan sumber daya, mulai dari CSS hingga skrip dan gambar. Cache-Control , pengembang dapat menentukan berapa lama sumber daya harus dianggap "segar" dan dapat dikembalikan dari cache browser.

 Cache-Control: max-age=30, public 

Dengan konfigurasi Cache-Control , transfer data dipertahankan dan file dapat digunakan dari cache browser selama beberapa detik ( max-age ). Peramban harus memeriksa kembali sumber daya yang di-cache setelah periode waktu ini.

Namun, jika pengunjung me-refresh halaman, browser akan memeriksanya kembali, termasuk tautan ke sumber daya untuk memastikan bahwa data yang di-cache masih valid. Server merespons dengan header 304, menandakan bahwa data yang di-cache masih valid, atau header 200 ketika mengirimkan data yang diperbarui. Ini memungkinkan Anda untuk menyimpan data yang ditransfer, tetapi belum tentu membuat permintaan.

Di sinilah fungsi immutable berperan.

Abadi - jangan pernah meminta sumber daya dua kali


Dalam aplikasi frontend modern, file CSS dan skrip biasanya memiliki nama unik, misalnya, styles.123abc.css . Nama file ini tergantung pada kontennya. Dan ketika Anda mengubah isi file, namanya juga berubah.

File-file unik ini berpotensi di-cache selamanya, termasuk ketika pengguna me-refresh halaman. immutable dapat mencegah browser memeriksa ulang sumber daya pada interval waktu tertentu. Ini sangat penting untuk objek dengan checksum, dan membantu menghindari permintaan validasi berulang.

 Cache-Control: max-age=31536000, public, immutable 

Menerapkan caching optimal sangat sulit, dan terutama caching browser tidak terlalu intuitif, karena memiliki berbagai konfigurasi. Saya sarankan Anda membaca materi berikut:


Terima-Pengkodean - kompresi maksimum (ke minimum)


Dengan bantuan Cache control kami dapat menyimpan permintaan dan mengurangi jumlah data yang dikirimkan berulang kali melalui jaringan. Kami tidak hanya dapat menyimpan permintaan, tetapi juga mengurangi apa yang dikirimkan.

Memberikan sumber daya, pengembang harus berhati-hati mengirim sesedikit mungkin data. Untuk sumber daya teks seperti HTML, CSS, dan JavaScript, kompresi memainkan peran penting dalam menyimpan data yang ditransfer.

Metode kompresi paling populer saat ini adalah GZIP. Server memiliki kekuatan yang cukup untuk mengompresi file teks dengan cepat dan memberikan data terkompresi saat diminta. Tetapi GZIP bukan lagi pilihan terbaik.

Jika Anda melihat permintaan yang dihasilkan browser untuk file teks, seperti HTML, CSS dan JavaScript, dan menganalisis header, Anda akan menemukan accept-encoding di antaranya.

 Accept-Encoding: gzip, deflate, br 

Header ini memberi tahu server algoritma kompresi mana yang dipahami. Parameter br kurang dikenal adalah singkatan dari kompresi Brotli dan digunakan pada situs dengan lalu lintas tinggi seperti Google dan Facebook. Untuk menggunakan Brotli, situs Anda harus berfungsi melalui HTTPS.

Algoritma kompresi ini dibuat dengan mempertimbangkan ukuran file yang kecil. Jika Anda mencoba mengompres file secara manual di perangkat lokal Anda, Anda akan menemukan bahwa Brotli benar-benar kompres lebih baik daripada GZIP.



Anda mungkin pernah mendengar bahwa kompresi Brotli lebih lambat. Alasannya adalah bahwa Brotli memiliki 11 mode kompresi, dan secara default yang memilih file terkecil diperoleh, yang memperpanjang prosedur. GZIP, di sisi lain, memiliki 9 mode, dan secara default satu dipilih yang memperhitungkan kecepatan kompresi dan ukuran file. Akibatnya, mode Brotli tidak cocok untuk kompresi on-the-fly secara default, tetapi jika Anda mengubah mode, Anda dapat memampatkan file kecil dengan kecepatan yang sama seperti GZIP. Anda dapat menggunakannya untuk kompresi dengan cepat dan menganggapnya sebagai pengganti potensial untuk GZIP untuk browser pendukung.

Selain itu, jika Anda ingin menyimpan file sebanyak mungkin, Anda dapat melupakan kompresi dinamis dan pra-hasilkan file GZIP yang dioptimalkan menggunakan file zopfli dan Brotli untuk pemeliharaan statisnya.

Jika Anda ingin membaca lebih lanjut tentang kompresi Brotli dan perbandingannya dengan GZIP, karyawan Akamai telah melakukan penelitian mendalam tentang topik ini .

Terima dan Terima-CH - Sajikan Sumber Daya Individual untuk Pengguna


Mengoptimalkan sumber daya teks sangat penting untuk menghemat kilobyte, tetapi bagaimana dengan sumber daya yang lebih berat seperti gambar untuk menyimpan lebih banyak data?

Terima - melayani gambar dalam format yang benar


Peramban tidak hanya menampilkan algoritma kompresi yang mereka pahami. Ketika browser meminta gambar, itu juga memberikan informasi tentang format file mana yang dimengerti.

 Accept: image/webp, image/apng, image/*,*/*;q=0.8 

Selama beberapa tahun, perjuangan diperebutkan dengan format gambar baru, tetapi memenangkan webp. Webp adalah format gambar yang diciptakan oleh Google , dan dukungan untuk format ini sekarang sangat relevan.

Dengan menggunakan header permintaan ini, pengembang dapat mengirim gambar webp bahkan jika browser meminta image.jpg , menghasilkan ukuran file yang lebih kecil. Dean Hume telah menulis panduan yang baik tentang cara menerapkan ini. Sangat keren!



Accept-CH - Melayani Gambar dengan Ukuran yang Tepat


Anda juga dapat mengaktifkan permintaan klien untuk browser yang mendukung fitur ini. Petunjuk klien adalah cara untuk memberi tahu browser untuk mengirim informasi tambahan tentang lebar area tampilan, lebar gambar, dan bahkan kondisi jaringan, seperti RTT (waktu pengiriman dan konfirmasi) dan jenis koneksi, misalnya 2g .

Anda dapat mengaktifkan petunjuk dengan menambahkan elemen meta:

 <meta http-equiv="Accept-CH" content="Viewport-Width, Downlink"> <meta http-equiv="Accept-CH-Lifetime" content="86400"> 

Atau dengan mengatur tajuk dalam permintaan HTML asli:

 Accept-CH: Width, Viewport-Width Accept-CH-Lifetime: 100 

Dalam permintaan berikutnya, browser akan mulai mengirim informasi tambahan untuk jangka waktu tertentu ( Accept-CH-Lifetime dalam detik), yang dapat membantu pengembang menyesuaikan gambar dengan kondisi pengguna tanpa mengubah HTML.

Misalnya, untuk informasi lebih lanjut, seperti lebar gambar di sisi server, Anda dapat memberikan gambar dengan atribut sizes untuk memberi informasi tambahan kepada peramban tentang bagaimana gambar ini akan terlihat.

 <!-- this images is laid over the full width | 100 viewport width --> <img class="w-100" src="/img/header.jpg" alt="" sizes="100vw"> 

Dengan header respons Accept-CH diterima dan gambar dengan atribut sizes , browser akan menyertakan header width dan width viewport-width dalam permintaan gambar, menunjukkan kepada Anda gambar mana yang paling cocok.



Memiliki format dan ukuran gambar yang didukung, Anda dapat mengirim data yang diadaptasi tanpa harus merekam elemen gambar yang tidak dapat diandalkan dan hanya memperhatikan format dan ukuran file, seperti yang ditunjukkan di bawah ini.

 <pictur> <!-- serve WebP to Chrome, Edge, Firefox and Opera --> <source media="(min-width: 50em)" sizes="50vw" srcset="/image/thing-200.webp 200w, /image/thing-400.webp 400w, /image/thing-800.webp 800w, /image/thing-1200.webp 1200w, /image/thing-1600.webp 1600w, /image/thing-2000.webp 2000w" type="image/webp"> <source sizes="(min-width: 30em) 100vw" srcset="/image/thing-crop-200.webp 200w, /image/thing-crop-400.webp 400w, /image/thing-crop-800.webp 800w, /image/thing-crop-1200.webp 1200w, /image/thing-crop-1600.webp 1600w, /image/thing-crop-2000.webp 2000w" type="image/webp"> <!-- serve JPEG to others --> <surce media="(min-width: 50em)" sizes="50vw" srcset="/image/thing-200.jpg 200w, /image/thing-400.jpg 400w, /image/thing-800.jpg 800w, /image/thing-1200.jpg 1200w, /image/thing-1600.jpg 1600w, /image/thing-2000.jpg 2000w"> <surce sizes="(min-width: 30em) 100vw" srcset="/image/thing-crop-200.jpg 200w, /image/thing-crop-400.jpg 400w, /image/thing-crop-800.jpg 800w, /image/thing-crop-1200.jpg 1200w, /image/thing-crop-1600.jpg 1600w, /image/thing-crop-2000.jpg 2000w"> <!-- fallback for browsers that don't support picture --> <img src="/image/thing.jpg" width="50%"> </pictur> 

Jika Anda memiliki akses ke lebar viewport dan ukuran gambar, Anda dapat menempatkan logika mengubah ukuran sumber daya di garis depan pada server Anda.

Namun, perlu diingat bahwa Anda tidak harus membuat gambar untuk lebar apa pun hanya karena Anda memiliki lebar gambar yang tepat. Mengirim gambar untuk rentang ukuran tertentu ( image-200 , image-300 , ... ) membantu menggunakan caching CDN dan menghemat waktu perhitungan.

Selain itu, dengan teknologi modern seperti pekerja layanan, Anda bahkan dapat mencegat dan memodifikasi permintaan langsung di klien untuk menyajikan file gambar terbaik. Dengan tooltips klien dihidupkan, pekerja layanan mendapatkan akses ke informasi tata letak, dan dikombinasikan dengan API gambar, seperti Cloudinary, Anda dapat mengonfigurasi url gambar langsung di browser untuk menerima gambar dengan ukuran yang benar.

Jika Anda mencari informasi lebih rinci tentang kiat-kiat klien, Anda dapat membaca artikel oleh Jeremy Wagner atau Ilya Grigorik tentang topik ini.

Jaringan harus hati-hati


Karena kita masing-masing menghabiskan berjam-jam sehari di jaringan, ada aspek terakhir yang saya anggap sangat penting - jaringan harus hati-hati.

Preload - mengurangi waktu tunggu


Sebagai pengembang, kami menghargai waktu pengguna kami. Tidak ada yang mau membuang waktu. , . , , .

: , , . , HTML . , , . .

Rel=preload , .

HTML-:

 <link rel="preload" href="/font.woff2" as="font" type="font/woff2" crossorigin="anonymous"> 

:

 Link: </font.woff2>; rel=preload; as=font; no-push 

, , , , . .

:

  • , .
  • preload , prefetch preconnect.

Feature-Policy โ€”


, . .

. , . . , , โ€” .

, , ? , ?

Feature-Policy. , , , , .

 Feature-Policy: vibrate 'none'; geolocation 'none' 

. , , , .

 <iframe allow="camera 'none'; microphone 'none'"> 

Feature-Policy , , , . , . .



MDN.

, โ€” push-. , Feature-Policy push- , . , GitHub.

feature policy , , , , .


, . , ยซHTTP- โ€” ยป .

, โ€” . , , , โ€ฆ . , , , -, , - .

Source: https://habr.com/ru/post/id450816/


All Articles