← Kembali ke Blog

JSON Web Tokens (JWT): Panduan Autentikasi

Panduan lengkap autentikasi JWT. Pelajari struktur JWT, implementasi, praktik terbaik keamanan, dan strategi penyegaran token.

Big JSON Team14 menit bacalanjutan
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

14 min read

Apa Itu JWT?

JSON Web Token (JWT) adalah format token yang ringkas dan aman untuk URL guna mengirimkan informasi secara aman antar pihak.

Struktur JWT

JWT memiliki tiga bagian yang dipisahkan oleh titik:

header.payload.signature
{

"alg": "HS256",

"typ": "JWT"

}

Payload (Klaim)

{

"sub": "1234567890",

"name": "John",

"iat": 1516239022,

"exp": 1516242622

}

Signature

Dibuat dengan menandatangani header + payload dengan kunci rahasia (secret key).

Klaim Standar

  • sub: Subjek (ID pengguna)
  • iss: Penerbit (Issuer)
  • aud: Audiens
  • exp: Waktu kedaluwarsa
  • iat: Waktu diterbitkan
  • nbf: Tidak sebelum (Not before)

Implementasi

Node.js

import jwt from 'jsonwebtoken';

const SECRET = process.env.JWT_SECRET;

// Membuat token

function createToken(user) {

return jwt.sign(

{ sub: user.id, email: user.email },

SECRET,

{ expiresIn: '1h' }

);

}

// Memverifikasi token

function verifyToken(token) {

try {

return jwt.verify(token, SECRET);

} catch (error) {

return null;

}

}

Python

import jwt

from datetime import datetime, timedelta

SECRET = os.environ['JWT_SECRET']

def create_token(user):

payload = {

'sub': user['id'],

'exp': datetime.utcnow() + timedelta(hours=1)

}

return jwt.encode(payload, SECRET, algorithm='HS256')

def verify_token(token):

try:

return jwt.decode(token, SECRET, algorithms=['HS256'])

except jwt.InvalidTokenError:

return None

Middleware Express

function authMiddleware(req, res, next) {

const token = req.headers.authorization?.split(' ')[1];

if (!token) {

return res.status(401).json({ error: 'Tidak ada token' });

}

try {

req.user = jwt.verify(token, SECRET);

next();

} catch (error) {

res.status(401).json({ error: 'Token tidak valid' });

}

}

app.get('/protected', authMiddleware, (req, res) => {

res.json({ user: req.user });

});

Strategi Penyegaran Token (Token Refresh)

// Access token berumur pendek

function createAccessToken(user) {

return jwt.sign(

{ sub: user.id, type: 'access' },

ACCESS_SECRET,

{ expiresIn: '15m' }

);

}

// Refresh token berumur panjang

function createRefreshToken(user) {

return jwt.sign(

{ sub: user.id, type: 'refresh' },

REFRESH_SECRET,

{ expiresIn: '7d' }

);

}

Praktik Terbaik Keamanan

  • Gunakan rahasia (secrets) yang kuat (256+ bit)
  • Atur kedaluwarsa singkat untuk access token
  • Validasi semua klaim (algoritma, penerbit, audiens)
  • Simpan token dengan aman (HttpOnly cookies)
  • Implementasikan pencabutan token (token revocation)
  • Kesalahan Umum

    Jangan Simpan Data Sensitif

    // ❌ Buruk
    

    const token = jwt.sign({

    userId: 123,

    password: 'rahasia' // Jangan pernah lakukan ini!

    }, secret);

    // ✅ Baik

    const token = jwt.sign({

    sub: 123,

    role: 'user'

    }, secret);

    Selalu Validasi Algoritma

    // ❌ Rentan
    

    jwt.verify(token, secret);

    // ✅ Aman

    jwt.verify(token, secret, { algorithms: ['HS256'] });

    Penanganan Token di Sisi Klien

    class AuthService {
    

    async fetch(url, options = {}) {

    const token = localStorage.getItem('accessToken');

    const response = await fetch(url, {

    ...options,

    headers: {

    ...options.headers,

    'Authorization': Bearer ${token}

    }

    });

    if (response.status === 401) {

    await this.refreshToken();

    return this.fetch(url, options);

    }

    return response;

    }

    }

    Penyimpanan Token

    HttpOnly Cookies (Direkomendasikan)

    res.cookie('token', jwt, {
    

    httpOnly: true,

    secure: true,

    sameSite: 'strict',

    maxAge: 3600000

    });

    LocalStorage (Kurang Aman)

    localStorage.setItem('token', jwt);

    Kesimpulan

    JWT sangat andal untuk autentikasi stateless. Gunakan waktu kedaluwarsa yang singkat, validasi semua klaim, dan jangan pernah menyimpan data sensitif di dalam payload!

    Share:

    Artikel Terkait

    Read in English