Implementasi JWT (JSON Web Token) di Laravel

Dipublikasikan pada oleh Admin

Website Custom vs Template

Implementasi JWT (JSON Web Token) di Laravel untuk Autentikasi Aman

JWT atau JSON Web Token adalah metode autentikasi modern yang banyak digunakan pada aplikasi API, mobile, dan SPA (Single Page Application). Dalam artikel ini kita akan membahas:

  • Konsep dasar JWT dan hubungannya dengan password
  • Langkah-langkah implementasi JWT di Laravel
  • Tips keamanan dalam penggunaan JWT

1. Apa Itu JWT?

JWT (JSON Web Token) adalah standar terbuka (RFC 7519) untuk pertukaran informasi antar sistem dengan cara yang aman. Token ini biasanya digunakan untuk proses autentikasi dan otorisasi tanpa harus menyimpan sesi di server.

JWT memiliki tiga bagian utama:

  • Header – berisi algoritma dan tipe token.
  • Payload – berisi klaim, seperti user ID, email, atau role.
  • Signature – tanda tangan digital yang menjamin keaslian token.

base64url(header) . base64url(payload) . signature

2. Keunggulan dan Tantangan JWT

Keunggulan

  • Bersifat stateless, tidak perlu menyimpan session di server.
  • Mudah diskalakan di banyak instance server.
  • Bisa digunakan lintas platform (PHP, Node.js, Flutter, dll).
  • Mendukung klaim tambahan seperti role dan scope.

Tantangan

  • Token tidak mudah dicabut sebelum kedaluwarsa tanpa sistem blacklist.
  • Perlu pengaturan expired token agar tidak disalahgunakan.
  • Wajib menggunakan HTTPS agar token tidak mudah bocor.

3. Keamanan Password

Meskipun JWT menangani sesi autentikasi, proses login tetap memerlukan password. Laravel sudah menyediakan fasilitas hashing yang aman untuk menyimpan password:

  • Gunakan Hash::make() saat menyimpan password.
  • Gunakan Hash::check() saat memverifikasi login.
  • Jangan pernah menyimpan password dalam bentuk teks asli.
  • Tambahkan validasi dan rate limit pada endpoint login.

4. Tutorial Implementasi JWT di Laravel

Berikut langkah demi langkah membuat autentikasi JWT di Laravel menggunakan paket php-open-source-saver/jwt-auth.

Langkah 1 — Instalasi Laravel

composer create-project laravel/laravel jwt-app
cd jwt-app
php artisan migrate

Langkah 2 — Instal Paket JWT

composer require php-open-source-saver/jwt-auth
php artisan vendor:publish --provider="PHPOpenSourceSaver\JWTAuth\Providers\LaravelServiceProvider"
php artisan jwt:secret

Perintah terakhir akan menambahkan JWT_SECRET ke file .env.

Langkah 3 — Konfigurasi Guard API

Buka file config/auth.php dan ubah guard api menjadi:

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
        'hash' => false,
    ],
],

Langkah 4 — Ubah Model User

Tambahkan implementasi JWTSubject ke model User:

use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

Langkah 5 — Buat Controller Autentikasi

php artisan make:controller AuthController

Isi dengan kode berikut:

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login', 'register']]);
    }

    public function register(Request $request)
    {
        $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        $token = Auth::guard('api')->login($user);

        return response()->json([
            'status' => 'success',
            'user' => $user,
            'authorization' => [
                'token' => $token,
                'type' => 'bearer',
            ],
        ]);
    }

    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (! $token = Auth::guard('api')->attempt($credentials)) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }

        return response()->json([
            'status' => 'success',
            'user' => Auth::guard('api')->user(),
            'authorization' => [
                'token' => $token,
                'type' => 'bearer',
            ],
        ]);
    }

    public function logout()
    {
        Auth::guard('api')->logout();
        return response()->json(['message' => 'Logged out successfully']);
    }

    public function refresh()
    {
        return response()->json([
            'status' => 'success',
            'user' => Auth::guard('api')->user(),
            'authorization' => [
                'token' => Auth::guard('api')->refresh(),
                'type' => 'bearer',
            ],
        ]);
    }
}

Langkah 6 — Tambahkan Route API

use App\Http\Controllers\AuthController;

Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
Route::post('logout', [AuthController::class, 'logout']);
Route::post('refresh', [AuthController::class, 'refresh']);

Route::middleware('auth:api')->get('/user-profile', function (Request $request) {
    return $request->user();
});

5. Pengujian API dengan Postman

  1. Register: Kirim POST /api/register dengan data nama, email, dan password.
  2. Login: Kirim POST /api/login untuk mendapatkan token JWT.
  3. Akses Terproteksi: Kirim GET /api/user-profile dengan header Authorization: Bearer <token>.
  4. Logout: Kirim POST /api/logout untuk mencabut token.
  5. Refresh: Kirim POST /api/refresh untuk memperbarui token.

6. Tips dan Best Practice

  • Selalu gunakan HTTPS untuk menghindari kebocoran token.
  • Atur TTL token agar tidak berlaku terlalu lama.
  • Gunakan refresh token untuk memperpanjang sesi tanpa login ulang.
  • Aktifkan fitur blacklist agar token logout tidak bisa digunakan lagi.
  • Jangan masukkan data sensitif dalam payload JWT.
  • Gunakan rate limiting untuk endpoint login.

7. Kesimpulan

JWT memberikan solusi autentikasi modern yang ringan dan efisien, terutama untuk aplikasi berbasis API. Dengan menggabungkan hashing password Laravel dan sistem token JWT, kamu dapat menciptakan autentikasi yang kuat, aman, dan mudah diintegrasikan dengan berbagai platform.

Ditulis oleh ChatGPT – asisten developer Laravel

← Fungsi dan Cara Menggunakan Rate Limiting di Laravel 9 Alat Content Marketing untuk Memaksimalkan Strategi Konten - Bag 1 →

6 Kesalahan SEO Fatal yang Sering Bikin Website Zonks

source image : https://www.freepik.com/free-vector/seo-analysis-isometric-composition-with-web-opt...

Baca Selengkapnya →

cara mengatasi deadlock dalam transaksi database di Laravel

Cara Mengatasi Deadlock dalam Transaksi Database di Laravel Deadlock dalam da...

Baca Selengkapnya →

9 Alat Content Marketing untuk Memaksimalkan Strategi Konten - Bag 3

7. Trello Konsistensi adalah kunci dalam content marketing. ...

Baca Selengkapnya →

Struktur Website yang Baik untuk SEO

Apa itu Struktur Website? Struktur website adalah susunan halaman dan hubungan an...

Baca Selengkapnya →

Implementasi JWT (JSON Web Token) di Laravel

Implementasi JWT (JSON Web Token) di Laravel untuk Autentikasi Aman JWT atau ...

Baca Selengkapnya →

Bangun Bisnis Modern: Website Custom, Kasir Pintar & CRM Cerdas

Pendahuluan Di era persaingan bisnis yang semakin ketat, digitalisasi bukan s...

Baca Selengkapnya →