Skip to content
Santekno.com | Tech Tutorials and Trends
ID
📖 0%
17 Aug 2025 · 5 mnt baca ·Artikel 48 / 125
Go

48 Menyimpan dan Mengecek Token JWT

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

48 Menyimpan dan Mengecek Token JWT

JSON Web Token (JWT) telah menjadi standar de facto dalam otentikasi modern, terutama untuk aplikasi berbasis web dan mobile. Penggunaan JWT memungkinkan kita untuk membuat sistem otentikasi yang bersifat stateless, sehingga server tidak perlu lagi menyimpan sesi (session) pengguna di backend. Namun, masih banyak pertanyaan mendasar di kalangan engineer, khususnya tentang tempat menyimpan token JWT dan cara mengeceknya secara aman. Artikel ini akan membahas tuntas dua aspek kunci tersebut: menyimpan dan memvalidasi JWT, lengkap dengan contoh kode, simulasi arsitektur sederhana, serta beberapa best practices yang patut diikuti.


Apa Itu JWT?

Secara sederhana, JWT adalah string berformat khusus yang terdiri dari tiga bagian utama:

  1. Header
  2. Payload
  3. Signature

JWT dikirimkan ke client setelah user berhasil login, lalu dikirim ulang ke server di setiap request yang membutuhkan otorisasi. JWT tidak hanya efisien, namun juga portable—bisa dibawa di mana saja, kapan saja.

Contoh token JWT:

text
1eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsIm5hbWUiOiJKb2huIERvZSJ9.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

Bagian 1: Menyimpan Token JWT di Client

Penyimpanan token JWT di sisi client bisa menjadi pedang bermata dua. Pilihan penyimpanan yang salah dapat menimbulkan celah keamanan seperti XSS dan CSRF. Ada beberapa opsi utama:

MetodeKelebihanKekurangan
Local StorageImplementasi mudah, akses luasRentan XSS
Session StorageSeperti localStorage, tapi session-basedRentan XSS, hilang saat tab ditutup
Cookie (HTTPOnly)Tidak bisa diakses JS, aman dari XSSRentan CSRF jika tanpa SameSite

Tabel 1: Perbandingan tempat penyimpanan token JWT

Simulasi Penyimpanan JWT di Local Storage

javascript
 1// Setelah login sukses
 2localStorage.setItem('access_token', jwtToken);
 3
 4// Mengambil token pada request selanjutnya
 5const token = localStorage.getItem('access_token');
 6fetch('/api/resource', {
 7  headers: {
 8    'Authorization': `Bearer ${token}`
 9  }
10});

Namun, localStorage sangat rentan terhadap serangan XSS. Jika attacker bisa menanamkan skrip jahat dalam aplikasi, token bisa dicuri dengan mudah.

Cara terbaik untuk kebutuhan keamanan lebih tinggi adalah dengan menyimpan JWT di cookie yang diberi flag HttpOnly dan SameSite.

javascript
1// Server mengirimkan set-cookie header saat login
2Set-Cookie: token=eyJhbGc...; HttpOnly; Secure; SameSite=Strict

Dengan cara ini, token tidak dapat diakses dari JavaScript, sehingga serangan XSS tidak bisa mengambilnya.

Pro Tips:

  • Gunakan SameSite=Strict jika aplikasi tidak perlu berbagi cookie lintas domain.
  • Tambahkan Secure agar cookie hanya terkirim melalui HTTPS.

Bagian 2: Mengecek/Memvalidasi Token JWT di Server

Setelah token JWT disimpan di client, langkah selanjutnya adalah mengecek validitas setiap request yang masuk. Umumnya, proses ini dilakukan dengan middleware di backend. Mari kita bahas pada dua stack: Node.js (Express) dan Go (Golang).

2.1 Cek Token JWT di Node.js/Express

Untuk verifikasi JWT di Express, kita akan memakai library jsonwebtoken .

Middleware Express: authenticateJWT.js

javascript
 1const jwt = require('jsonwebtoken');
 2
 3function authenticateJWT(req, res, next) {
 4  const authHeader = req.headers.authorization;
 5
 6  if (authHeader) {
 7    // Format: "Bearer <token>"
 8    const token = authHeader.split(' ')[1];
 9
10    jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
11      if (err) {
12        return res.sendStatus(403); // Forbidden
13      }
14      req.user = user;
15      next();
16    });
17  } else {
18    res.sendStatus(401); // Unauthorized
19  }
20}
21
22module.exports = authenticateJWT;

Penggunaan Middleware

javascript
1const express = require('express');
2const authenticateJWT = require('./authenticateJWT');
3
4const app = express();
5
6app.get('/api/resource', authenticateJWT, (req, res) => {
7  res.json({ message: "Hello, " + req.user.name });
8});

2.2 Verifikasi JWT di Golang

Di Golang, biasanya kita menggunakan package github.com/golang-jwt/jwt/v4 .

go
 1import (
 2    "github.com/golang-jwt/jwt/v4"
 3    "net/http"
 4    "strings"
 5)
 6
 7var secretKey = []byte("your-secret-key")
 8
 9func authMiddleware(next http.Handler) http.Handler {
10    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
11        authHeader := r.Header.Get("Authorization")
12        if authHeader == "" {
13            http.Error(w, "missing auth header", http.StatusUnauthorized)
14            return
15        }
16
17        tokenString := strings.TrimPrefix(authHeader, "Bearer ")
18        token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
19            return secretKey, nil
20        })
21
22        if err != nil || !token.Valid {
23            http.Error(w, "invalid token", http.StatusForbidden)
24            return
25        }
26        next.ServeHTTP(w, r)
27    })
28}

Diagram Alur: Proses Validasi JWT

Mari kita ilustrasikan secara visual alur penyimpanan dan pengecekan token JWT.

MERMAID
sequenceDiagram
    participant Client
    participant Server

    Client->>Server: Login (username, password)
    Server-->>Client: JWT Token (response body / Set-Cookie)
    Note over Client: Simpan token (localStorage/cookie)

    Client->>Server: Request API (Authorization: Bearer)
    Server->>Server: Verifikasi JWT (cek signature & expired)
    alt Valid
      Server-->>Client: Data/Respon Success
    else Tidak Valid
      Server-->>Client: 401/403 Error
    end

Studi Kasus: Client Local Storage VS Cookies

SkenariolocalStorageCookies (HTTPOnly)
Dapat dicuri via XSSYaTidak
Dapat digunakan untuk CSRFTidak (umumnya)Ya (jika tanpa SameSite=Strict)
Dapat diakses JavaScriptYaTidak
Implementasi Safari/AndroidKonsistenKadang masalah di CORS dan domain/subdomain

Best Practices

  1. Gunakan Cookie HTTPOnly jika aplikasi sangat mementingkan keamanan.
  2. Tambahkan mekanisme refresh token terpisah, bukan bagian dari JWT utama.
  3. Pastikan library JWT di server selalu update.
  4. Selalu validasi exp (expired field) pada payload JWT.
  5. Tidak menyimpan data sensitif di payload.
  6. Lakukan revoke dengan menyimpan daftar blacklist di server (opsional, jika perlu session revoke).

Kesimpulan

Menyimpan dan mengecek token JWT bukan sekadar implementasi teknis, namun juga keputusan arsitektural yang sangat mempengaruhi keamanan aplikasi.
Sebelum memilih metode penyimpanan, pahami trade-off antara kemudahan (developer experience) dan keamanan (security risk). Untuk aplikasi skala kecil-menengah, localStorage sering jadi pilihan praktis, tapi untuk aplikasi finansial atau data sensitif, cookie dengan HttpOnly adalah pilihan mutlak.

Selalu evaluasi kembali security landscape aplikasi Anda secara berkala, dan jangan ragu untuk mengadopsi best practices terbaru di dunia otentikasi JWT. Happy coding!

Artikel Terkait

💬 Komentar