Skip to content
12 Juni 2026 3 min readFeatured

migrasi-jwt-ke-session-based-nextjs

Gue baru aja migrasi auth flow dari JWT ke session-based pakai Iron Session di Next.js. Yuk, simak tantangannya dan perbandingan arsitektur sebelum dan sesudah!

apiperformancearchitecture
Nurikhsan
NurikhsanFull-stack Developer & UI Designer

Jadi gini, gue baru aja ngalamin migrasi auth flow yang lumayan ribet. Dari yang awalnya pake JWT, sekarang beralih ke session-based dengan Iron Session di Next.js. Awalnya sih, gue mikir "ah, ini pasti gampang," tapi ternyata banyak tantangan yang harus dihadapi. Nah, di artikel ini, gue bakal cerita perjalanan ini, plus perbandingan arsitektur sebelum dan sesudah.

Kenapa Milih Session-Based?

Pertama-tama, kenapa sih gue milih untuk migrasi ke session-based? Intinya, ada beberapa alasan. Yang paling utama adalah security dan performance. JWT itu enak karena stateless, tapi kadang bisa bikin kita was-was juga, terutama soal token expiration. Dengan session-based, kita bisa lebih kontrol dan pastikan session management yang lebih aman. Selain itu, session-based ini juga bisa ngebantu dalam mengurangi overhead di client-side. Jadi, lebih ringan dan cepat, terutama buat user yang sering login dan logout.

Tantangan di Middleware dan Edge Runtime

Nah, setelah mutusin untuk migrasi, tantangan pertama muncul di middleware. Pas gue coba implementasi Iron Session di Next.js, ternyata ada beberapa hal yang harus diatur ulang. Middleware yang sebelumnya udah dibikin untuk JWT jadi harus diadaptasi. Gini, dengan JWT, proses validasi token itu di setiap request, sedangkan di session-based, kita perlu ngecek session dari server. Ini sedikit lebih rumit karena kita harus pastikan session itu valid di setiap request yang masuk. Jadi, banyak yang harus diubah dan di-setting ulang. Dan, jangan lupa tentang edge runtime. Dengan Next.js, kita bisa memanfaatkan edge function untuk ngebantu performa, tapi itu juga bikin kita harus paham betul cara session management di edge. Nah, disini gue sempet bingung, karena edge runtime punya batasan yang bikin penggunaan session jadi tricky.

Mengatasi Race Condition

Masalah besar lainnya yang muncul adalah race condition. Jadi, bayangin lo lagi refresh token, eh tiba-tiba session-nya bisa jadi invalid. Anjir, ini bikin frustrasi banget. Gue harus cari cara supaya session itu tetap konsisten meskipun ada banyak request yang datang sekaligus. Salah satu solusinya adalah dengan menggunakan locking mechanism. Jadi, setiap kali ada request yang mau nge-refresh session, gue pastikan hanya satu yang bisa jalan di satu waktu. Ini ngebantu banget, meskipun awalnya bikin coding jadi sedikit njlimet.

Perbandingan Arsitektur Sebelum dan Sesudah

Nah, biar lebih jelas, gini alurnya:

flowchart LR
    A[User] -->|Login| B[JWT]
    B -->|Validasi| C[Middleware]
    C -->|Response| D[Client]
    D -->|Refresh Token| B
    
    E[User] -->|Login| F[Session-Based]
    F -->|Validasi| G[Middleware]
    G -->|Response| H[Client]
    H -->|Refresh Session| F

Dari diagram di atas, lo bisa lihat perbedaan alur antara JWT dan session-based. Di JWT, flow-nya lebih langsung, tapi di session-based, kita punya lebih banyak kontrol di middleware. Ini jelas bikin arsitektur jadi lebih kompleks, tapi dari sisi security dan performance, hasilnya berasa banget.

Kesimpulan

Akhirnya, migrasi ini bikin gue belajar banyak tentang session management dan tantangan yang ada di dalamnya. Meskipun ada beberapa frustrasi, terutama di middleware dan race condition, hasil akhirnya bikin semua effort itu worth it. Jadi, buat lo yang mau migrasi ke session-based, siap-siap aja sama tantangan yang ada, tapi percayalah, hasilnya bakal ngebantu banget di performa dan keamanan aplikasi lo.

Related articles

Chat WhatsApp