37. Otentikasi di Middleware gRPC: Implemetasi dan Studi Kasus
gRPC telah menjadi pilihan utama dalam membangun arsitektur layanan mikro modern. Keunggulannya dalam hal performa dan protokol yang agnostik membuat gRPC sangat populer di lingkungan perusahaan maupun startup. Namun, di balik kecanggihannya, ada satu tantangan klasik yang senantiasa hadir—otentikasi.
Pada artikel ini, kita akan fokus membahas strategi otentikasi pada middleware di gRPC. Saya akan menguraikan konsep dasarnya, membandingkan beberapa pendekatan, lalu mengajak Anda hands-on membangun middleware otentikasi dengan contoh kode nyata dalam Go.
Daftar Isi
- Mengapa Otentikasi pada Middleware?
- Jenis-jenis Otentikasi pada gRPC
- Konsep Middleware di gRPC
- Membangun Middleware Otentikasi: Studi Kasus di Go
- Simulasi Request, Tabel, dan Diagram Alur
- Best Practice dan Kesalahan Umum
- Penutup
Mengapa Otentikasi pada Middleware?
Middleware memungkinkan kita menyisipkan logika lintas-layanan di antara pipeline permintaan dan respons. Otentikasi adalah salah satu aspek kritikal yang nyaris selalu dihandle lewat middleware—ini alasannya:
- Middleware dapat mengakses object context dan metadata di seluruh request.
- Ia terlepas dari logika aplikasi bisnis sehingga lebih mudah dijaga dan dikembangkan.
- Separation of Concerns antara keamanan dan domain bisnis.
Dengan menempatkan otentikasi di middleware, kita dapat memastikan bahwa hanya request sah yang diteruskan ke service handler utama.
Jenis-jenis Otentikasi pada gRPC
Mari lihat beberapa tipe otentikasi yang sering diimplementasikan di gRPC:
Tipe Otentikasi | Keterangan | Cocok untuk |
---|---|---|
API Key | Token unik per aplikasi | Internal Microservice |
Basic Auth | Kombinasi user & pass | Legacy System |
JWT (Bearer Token) | Stateless, scalable | Public API |
mTLS (Mutual TLS) | Saling verifikasi cert | Service-to-Service |
OAuth2 | Delegasi otorisasi | Third-party Developer |
Konsep Middleware di gRPC
Di gRPC (Go), middleware umumnya diimplementasikan via interceptor. Ada dua jenis interceptor utama:
- Unary Interceptor: Untuk unary calls (request-response).
- Stream Interceptor: Untuk streaming calls (bidi/stream).
Implementasi interceptor memungkinkan kita menyuntikkan logika pre/post-process pada setiap panggilan RPC—termasuk autentikasi, logging, rate limiting, dll.
Diagram Alur Middleware Otentikasi gRPC
Mari visualisasikan bagaimana interceptor melakukan otentikasi sebelum request benar-benar dieksekusi handler:
flowchart TD Client -->|Request gRPC| Middleware Middleware -->|Token Valid| Handler Middleware -->|Token Invalid| ErrorResponse Handler -->|Response| Client ErrorResponse -->|401 Unauthorized| Client
Membangun Middleware Otentikasi: Studi Kasus di Go
Pada studi kasus ini, kita akan membuat unary interceptor untuk otentikasi dengan skenario sebagai berikut:
- Client mengirim metadata Authorization (Bearer Token).
- Middleware memverifikasi token.
- Jika valid, request diteruskan ke handler.
- Jika invalid, request ditolak (Unauthenticated).
1. Definisikan Middleware Interceptor
import (
"context"
"strings"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
// Misal, validToken = "mysecuretoken"
var validToken = "mysecuretoken"
func AuthUnaryInterceptor(
ctx context.Context,
req interface{},
info *grpc.UnaryServerInfo,
handler grpc.UnaryHandler,
) (interface{}, error) {
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
return nil, status.Error(codes.Unauthenticated, "metadata is not provided")
}
authHeader, exists := md["authorization"]
if !exists || len(authHeader) == 0 {
return nil, status.Error(codes.Unauthenticated, "authorization token is not provided")
}
// Bearer <token>
token := strings.TrimPrefix(authHeader[0], "Bearer ")
if token != validToken {
return nil, status.Error(codes.Unauthenticated, "invalid token")
}
// Forward to handler
return handler(ctx, req)
}
2. Daftarkan pada gRPC Server
s := grpc.NewServer(
grpc.UnaryInterceptor(AuthUnaryInterceptor),
)
3. Simulasi Request: Client dengan Token Valid dan Tidak Valid
Dengan Token Valid
Authorization: Bearer mysecuretoken
Respons: <Berhasil, kode 200>
Dengan Token Tidak Valid
Authorization: Bearer awasalah
Respons: <Kode error: unauthenticated, status 16>
Tanpa Authorization Header
Respons: <Kode error: unauthenticated, status 16>
4. Tabel Simulasi Respons
Kondisi | Header Authorization | Status | Keterangan |
---|---|---|---|
Token valid | Bearer mysecuretoken | OK (200) | Request diterima |
Token salah | Bearer invalidtoken | Unauthenticated (16) | Ditolak |
Header Authorization tidak ada | - | Unauthenticated (16) | Ditolak |
Best Practice dan Kesalahan Umum
Beberapa hal yang perlu diperhatikan dalam implementasi otentikasi di middleware gRPC:
Dos ✔️
- Gunakan middleware perimeter untuk seluruh endpoint sensitif.
- Pisahkan autentikasi (proof) dari otorisasi (hak akses).
- Enkripsi transport: selalu gunakan TLS (atau mTLS jika aman).
Don’ts ❌
- Jangan simpan hardcoded token di kode produksi (gunakan environment variable/secret manager).
- Jangan mengabaikan expired token pada JWT.
- Jangan bypass middleware untuk endpoint tertentu tanpa alasan yang tepat.
Advanced: Middleware Chaining
Kadang, kita ingin menggabungkan beberapa middleware: contohnya otentikasi dan logging.
import grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
s := grpc.NewServer(
grpc_middleware.WithUnaryServerChain(
LoggingUnaryInterceptor,
AuthUnaryInterceptor,
),
)
Kesimpulan
Menerapkan otentikasi pada middleware gRPC bukan hanya tentang sekedar memvalidasi token, melainkan juga membangun enforcement point yang konsisten dan aman di seluruh layanan. Middleware otentikasi adalah fondasi utama untuk “Zero Trust” dalam service-to-service communication.
Untuk menghindari jebakan klasik, pastikan Anda:
- Selalu gunakan TLS, bahkan di dalam internal network.
- Pisahkan logic otentikasi dari otorisasi.
- Uji dan awasi middleware Anda, pastikan tidak mudah di-bypass.
Saya harap contoh kode, simulasi, dan diagram alur pada artikel ini dapat membantu Anda membangun otentikasi yang kuat secara idiomatis untuk ekosistem gRPC Anda.
Referensi lebih lanjut:
Jika ada pertanyaan atau pengalaman menarik tentang otentikasi di gRPC, sampaikan di kolom komentar! 🚀
14 Menghubungkan Skema dan Resolver ke HTTP Handler
Artikel Terhangat
37 Otentikasi di Middleware gRPC
07 Jul 2025
36 Rate Limiting di Interceptor
07 Jul 2025
13 Membuat Resolver Pertama di graphql-go
07 Jul 2025
35 Validasi Request menggunakan Interceptor
07 Jul 2025
12 Menulis File Skema GraphQL Pertama Anda
07 Jul 2025
34 Logging Interceptor dengan Context
07 Jul 2025

37 Otentikasi di Middleware gRPC

36 Rate Limiting di Interceptor

13 Membuat Resolver Pertama di graphql-go

35 Validasi Request menggunakan Interceptor

12 Menulis File Skema GraphQL Pertama Anda
