Lewati ke konten

HTTPS Redirect

Deserve tidak punya middleware HTTPS redirect, dan memaksakannya di dalam aplikasi adalah lapisan yang salah untuk pekerjaan itu. TLS diterminasi di edge, jadi aplikasi jarang melihat skema asli sejak awal.

Kenapa Tidak Dibawa

Sebuah HTTPS redirect paksa mengirim request http:// apa pun kembali sebagai https://. Masalahnya ada di mana TLS sebenarnya berada. Di produksi sertifikat duduk di proxy atau load balancer seperti Cloudflare atau nginx, yang menterminasi TLS dan meneruskan HTTP polos ke origin. Aplikasi lalu melihat http, meski klien terhubung lewat https, jadi redirect yang dibangun dari skema lokal akan memantulkan request yang sudah aman.

Begitulah redirect loop terjadi. Proxy bicara HTTPS ke klien, origin melihat HTTP dan redirect ke HTTPS, proxy meneruskan HTTP lagi, dan loop tak pernah berakhir. Tempat aman untuk menegakkan HTTPS adalah lapisan yang memiliki sertifikat, sejalan dengan bangun di atas platform.

Di Mana HTTPS Berada

Redirect-nya sendiri adalah satu baris konfigurasi proxy, bukan kode aplikasi:

  • Di proxy - Cloudflare dan nginx redirect http ke https sebelum trafik mencapai origin, jadi aplikasi hanya pernah menyajikan request yang aman.
  • Di browser - header Strict-Transport-Security memberi tahu browser untuk memakai HTTPS sendiri pada kunjungan berikutnya, yang menghapus redirect setelah response aman pertama.

Deserve sudah menangani separuh kedua. Middleware security headers mengatur HSTS lewat opsi strictTransportSecurity, mati secara default dan dimaksudkan menyala setelah server dicapai lewat HTTPS.

typescript
// Suruh browser tetap pakai HTTPS
router
.
use
(
Mware
.
securityHeaders
({
strictTransportSecurity
: 'max-age=31536000; includeSubDomains'
}) ) await
router
.
serve
(8000)

Membaca Skema Asli

Ketika aplikasi memang perlu tahu apakah klien memakai HTTPS, jawabannya ada di header forwarded yang diatur proxy, bukan di koneksi lokal. Proxy tepercaya menambahkan X-Forwarded-Proto, dibaca lewat ctx.header.

typescript
export function 
GET
(
ctx
:
Context
): Response {
// Skema yang benar-benar dipakai klien const
proto
=
ctx
.
header
('x-forwarded-proto') ?? 'http'
return
ctx
.
send
.
json
({
secure
:
proto
=== 'https' })
}

Percayai header ini hanya di belakang proxy yang dikonfigurasi lewat trustProxy, batas kepercayaan yang sama diandalkan ctx.ip. Klien yang tak tepercaya bisa mengatur header apa pun, jadi nilainya tak berarti tanpa batas itu.

Menyajikan HTTPS Langsung

Server tanpa proxy di depan bisa menterminasi TLS sendiri dengan memberikan sertifikat dan kunci ke Deno.serve, runtime di bawah konfigurasi server. Bahkan saat itu redirect dari http ke https adalah urusan listener terpisah, bukan middleware, jadi aplikasi tetap fokus pada request yang diterimanya.

Dirilis di bawah Lisensi MIT.