fix(auth): hapus fallback SESSION_PASSWORD yang hardcoded, throw error saat startup jika tidak di-set

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-08 16:30:01 +08:00
parent 8f2081cc77
commit bf9c37ff98
2 changed files with 72 additions and 1 deletions

View File

@@ -0,0 +1,66 @@
# Summary: Fix SESSION_PASSWORD Fallback — Security Hardening
**Tanggal**: 8 Juni 2026
**Branch**: `tasks/auth/fix-session-password-fallback/20260608`
**File diubah**: `src/lib/session.ts`
---
## Permasalahan
Baris 33 di `src/lib/session.ts` menggunakan operator `||` sebagai fallback:
```ts
password: process.env.SESSION_PASSWORD || 'default-password-change-in-production',
```
Jika env var `SESSION_PASSWORD` tidak di-set, iron-session **diam-diam** memakai string `'default-password-change-in-production'` sebagai kunci enkripsi session cookie. String ini diketahui publik karena ada di source code. Siapa pun yang mengetahui nilai tersebut dapat memalsukan session cookie dan masuk sebagai user mana pun tanpa autentikasi.
Risikonya:
- Aplikasi tetap berjalan normal tanpa peringatan apapun
- Deployment yang lupa set env var langsung rentan session forgery
- Tidak ada fail-fast — masalah baru terdeteksi setelah ada insiden
---
## Perubahan
**File**: `src/lib/session.ts` (baris 3135)
**Sebelum**:
```ts
const SESSION_OPTIONS = {
cookieName: 'desa-session',
password: process.env.SESSION_PASSWORD || 'default-password-change-in-production',
...
};
```
**Sesudah**:
```ts
const sessionPassword = process.env.SESSION_PASSWORD;
if (!sessionPassword) {
throw new Error('SESSION_PASSWORD env var is not set. Set it to a random string of at least 32 characters.');
}
const SESSION_OPTIONS = {
cookieName: 'desa-session',
password: sessionPassword,
...
};
```
---
## Dampak
- Jika `SESSION_PASSWORD` tidak di-set, server **langsung crash** saat startup dengan pesan error yang jelas.
- Tidak ada deployment yang bisa berjalan tanpa password yang valid.
- Tidak ada perubahan fungsional untuk environment yang sudah set env var dengan benar.
---
## Kategori
- **Security fix** — menghilangkan hardcoded fallback password di session config
- **Fail-fast pattern** — error eksplisit saat startup lebih aman dari silent default

View File

@@ -28,9 +28,14 @@ export type Session = SessionData & {
destroy: () => Promise<void>;
};
const sessionPassword = process.env.SESSION_PASSWORD;
if (!sessionPassword) {
throw new Error('SESSION_PASSWORD env var is not set. Set it to a random string of at least 32 characters.');
}
const SESSION_OPTIONS = {
cookieName: 'desa-session',
password: process.env.SESSION_PASSWORD || 'default-password-change-in-production',
password: sessionPassword,
cookieOptions: {
secure: process.env.NODE_ENV === 'production',
httpOnly: true,