Menggunakan Refresh Token untuk Sesi Login Lebih Panjang

Ilustrasi Gambar.

Halo sobat ruanginformatika! ๐Ÿ‘‹

Sampai sini, aplikasi todomu sudah bisa login, logout, dan proteksi halaman. Tapi pasti kamu pernah ngalamin ini:

โ€œLoh, kok tiba-tiba logout sendiri? Padahal baru buka 1 jam lalu.โ€

Itu terjadi karena token biasanya punya masa hidup pendek (misalnya 15โ€“30 menit). Supaya user tidak terus login ulang, kita pakai sistem Refresh Token.

๐Ÿง  Apa itu Refresh Token?

  • Access Token โ†’ Digunakan untuk request API (masa aktif pendek)
  • Refresh Token โ†’ Disimpan di browser (httpOnly cookie) untuk dapatkan access token baru

Skema kerjanya seperti ini:

  1. User login โ†’ Dapat access token + refresh token
  2. Access token disimpan di localStorage
  3. Refresh token disimpan di cookie (httpOnly)
  4. Ketika access token habis, frontend minta token baru ke backend via /refresh

๐Ÿ›  Backend – Menambahkan Refresh Token

1๏ธโƒฃ Tambahkan Endpoint /refresh


// routes/auth.js
const jwt = require('jsonwebtoken');

router.post('/refresh', (req, res) => {
  const token = req.cookies.refreshToken;
  if (!token) return res.status(401).json({ message: 'Token tidak ditemukan' });

  try {
    const payload = jwt.verify(token, process.env.REFRESH_SECRET);
    const accessToken = jwt.sign({ id: payload.id }, process.env.JWT_SECRET, { expiresIn: '15m' });
    res.json({ accessToken });
  } catch (err) {
    res.status(403).json({ message: 'Refresh token tidak valid' });
  }
});
  

2๏ธโƒฃ Kirim Refresh Token saat Login


const refreshToken = jwt.sign({ id: user._id }, process.env.REFRESH_SECRET, { expiresIn: '7d' });
res.cookie('refreshToken', refreshToken, {
  httpOnly: true,
  secure: true,
  sameSite: 'Strict',
  maxAge: 7 * 24 * 60 * 60 * 1000 // 7 hari
});
res.json({ accessToken });
  

Pastikan pakai middleware cookie-parser:


npm install cookie-parser

// index.js
const cookieParser = require('cookie-parser');
app.use(cookieParser());
  

๐Ÿงช Frontend – Gunakan Refresh Token

1๏ธโƒฃ Tangani Expired Token

Kita gunakan interceptor Axios untuk otomatis refresh saat token kadaluarsa:


import axios from 'axios';

const API = axios.create({
  baseURL: import.meta.env.VITE_API_BASE,
  withCredentials: true // penting agar cookie terkirim!
});

API.interceptors.response.use(
  res => res,
  async err => {
    const originalRequest = err.config;
    if (err.response.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      const res = await axios.post('/auth/refresh', {}, { withCredentials: true });
      localStorage.setItem('token', res.data.accessToken);
      API.defaults.headers.common['Authorization'] = `Bearer ${res.data.accessToken}`;
      originalRequest.headers['Authorization'] = `Bearer ${res.data.accessToken}`;
      return API(originalRequest);
    }
    return Promise.reject(err);
  }
);

export default API;
  

๐Ÿ”’ Catatan Keamanan

  • Simpan refresh token di cookie (bukan localStorage!)
  • Gunakan httpOnly dan secure untuk mencegah XSS
  • Set sameSite=Strict agar tidak dibajak oleh website lain

โœ… Penutup

Sekarang aplikasi kamu makin profesional dan aman. User bisa login 1 kali dan tetap aman tanpa harus login ulang setiap 15 menit.

Di seri selanjutnya, kita bisa bahas:

Sampai jumpa di artikel ruanginformatika selanjutnya! ๐Ÿš€


Ditulis oleh ruanginformatika.com

Leave a Reply

Your email address will not be published. Required fields are marked *

You might also like