0Pricing
Go Academy · Pelajaran

Middleware Autentikasi dan Pembatasan Laju

Validasi JWT dan pembatasan laju berbasis token bucket

Middleware Autentikasi dan Pembatasan Laju adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Perangkat tengah autentikasi JWT

Ekstrak, uraikan, dan validasi JWT dari header Authorization:

func JWTAuth(secret []byte) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            header := r.Header.Get("Authorization")
            if !strings.HasPrefix(header, "Bearer ") {
                http.Error(w, "missing token", 401); return
            }
            token := strings.TrimPrefix(header, "Bearer ")
            claims, err := parseJWT(token, secret)
            if err != nil {
                http.Error(w, "invalid token", 401); return
            }
            ctx := context.WithValue(r.Context(), claimsKey{}, claims)
            next.ServeHTTP(w, r.WithContext(ctx))
        })
    }
}

Autentikasi kunci API

Validasi kunci API dari header terhadap basis data atau kumpulan di memori:

func APIKeyAuth(validKeys map[string]bool) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            key := r.Header.Get("X-API-Key")
            if !validKeys[key] {
                http.Error(w, "forbidden", 403); return
            }
            next.ServeHTTP(w, r)
        })
    }
}

Pembatas laju token bucket

Gunakan golang.org/x/time/rate dengan peta pembatas per-IP:

var limiters sync.Map

func getLimiter(ip string) *rate.Limiter {
    v, _ := limiters.LoadOrStore(ip, rate.NewLimiter(rate.Every(time.Second), 10))
    return v.(*rate.Limiter)
}

Perangkat tengah pembatas laju

Periksa pembatas di perangkat tengah dan kembalikan 429 jika batas terlampaui:

func RateLimit(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        ip, _, _ := net.SplitHostPort(r.RemoteAddr)
        if !getLimiter(ip).Allow() {
            http.Error(w, "rate limit exceeded", 429); return
        }
        next.ServeHTTP(w, r)
    })
}

Header Retry-After

Sertakan header Retry-After dengan jumlah detik yang harus ditunggu klien sebelum mencoba lagi:

w.Header().Set("Retry-After", "1")
http.Error(w, "rate limit exceeded", 429)

Kontrol akses berbasis peran

Setelah autentikasi, periksa peran pengguna dari klaim konteks sebelum memanggil Next:

func RequireRole(role string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            claims := claimsFromContext(r.Context())
            if !claims.HasRole(role) {
                http.Error(w, "forbidden", 403); return
            }
            next.ServeHTTP(w, r)
        })
    }
}

Pembersihan pembatas laju

Pembatas per-IP yang lama menumpuk di memori. Bersihkan dengan goroutine latar belakang yang menghapus entri yang tidak diakses selama N menit terakhir.

Pembatasan laju terdistribusi

Pembatas dalam proses tidak berfungsi di beberapa instans. Gunakan Redis + skrip jendela geser atau token bucket untuk pembatasan laju terdistribusi.

429 dibandingkan 503

Kembalikan 429 Too Many Requests ketika klien tertentu terkena pembatasan laju. Kembalikan 503 Service Unavailable ketika seluruh layanan kelebihan beban dan mengurangi beban.

Menggabungkan autentikasi dan pembatas laju

Terapkan keduanya sebagai perangkat tengah terpisah dalam rantai. Autentikasi harus didahulukan: batasi laju hanya untuk pengguna yang telah diautentikasi agar pembedaan dilakukan berdasarkan ID pengguna, bukan alamat IP.

Pengujian perangkat tengah autentikasi

Gunakan httptest untuk mengirim token yang valid dan tidak valid, lalu pastikan kode status yang benar serta nilai konteks telah ditetapkan.

Pemeriksaan Singkat

Kode status HTTP mana yang harus dikembalikan perangkat tengah pembatas laju ketika klien melampaui batasnya?

Ringkasan: Autentikasi dan Pembatasan Laju

Poin-poin penting:

  • Perangkat tengah JWT: ekstrak token Bearer → uraikan → lampirkan klaim ke konteks
  • Batasi laju dengan golang.org/x/time/rate berdasarkan IP atau pengguna
  • Kembalikan 429 + header Retry-After ketika batas terlampaui
  • Terdistribusi: gunakan Redis untuk pembatasan laju di banyak instans

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Middleware Autentikasi dan Pembatasan Laju” gratis?

Ya — teks lengkap “Middleware Autentikasi dan Pembatasan Laju” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Middleware Autentikasi dan Pembatasan Laju”?

Validasi JWT dan pembatasan laju berbasis token bucket Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Middleware Autentikasi dan Pembatasan Laju” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Dasar-Dasar Rantai Middleware HTTP
  2. Middleware Logging dan ID Permintaan
  3. Middleware Autentikasi dan Pembatasan Laju
  4. Middleware CORS dan Pemulihan dari Panic
← Kembali ke Go Academy