tutorial

37 Otentikasi di Middleware gRPC

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?

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 OtentikasiKeteranganCocok untuk
API KeyToken unik per aplikasiInternal Microservice
Basic AuthKombinasi user & passLegacy System
JWT (Bearer Token)Stateless, scalablePublic API
mTLS (Mutual TLS)Saling verifikasi certService-to-Service
OAuth2Delegasi otorisasiThird-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

KondisiHeader AuthorizationStatusKeterangan
Token validBearer mysecuretokenOK (200)Request diterima
Token salahBearer invalidtokenUnauthenticated (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! 🚀

comments powered by Disqus

Topik Terhangat

programming
207
tutorial
74
tips-and-trick
43
jaringan
28
hardware
11
linux
4
kubernetes
1