feat: 세션 관리 및 로그인 후 사용자 홈 화면 구현 (Phase 2 완료)

- express-session을 이용한 로그인 상태 유지 구현
- 인증 성공 시 /home.html 리디렉션 및 정보 표시 기능 추가
- 로그아웃 기능 구현
- UI 흐름 개선: 로그인 성공 시 홈 화면으로 자동 이동
This commit is contained in:
2026-04-09 14:18:14 +09:00
parent ea2b96c9a5
commit cf9eecf19f
5 changed files with 212 additions and 3 deletions

View File

@@ -1,5 +1,6 @@
require('dotenv').config();
const express = require('express');
const session = require('express-session');
const path = require('path');
const fs = require('fs');
const { generateKeyPair, exportJWK } = require('jose');
@@ -9,8 +10,23 @@ const app = express();
const PORT = process.env.PORT || 3000;
app.use(express.json());
app.use(session({
secret: 'headless-demo-secret-key',
resave: false,
saveUninitialized: true,
cookie: { secure: false } // 개발 환경이므로 false
}));
app.use(express.static(path.join(__dirname, 'public')));
// 인증 체크 미들웨어
const isAuthenticated = (req, res, next) => {
if (req.session.user) {
next();
} else {
res.status(401).json({ success: false, message: '인증이 필요합니다.' });
}
};
let jwks;
let oidcClient;
@@ -75,12 +91,17 @@ app.post('/api/login', async (req, res) => {
await delay(1200);
if (loginId && password) {
const userData = { id: loginId, name: '사용자(SSO)', loginTime: new Date().toISOString() };
console.log(`[OIDC Success] ID Token received and verified using SSO public keys.`);
// 세션에 저장
req.session.user = userData;
res.json({
success: true,
message: 'SSO(OIDC) 인증 성공',
user: { id: loginId, name: '사용자(SSO)' },
redirectTo: '/home'
user: userData,
redirectTo: '/home.html'
});
} else {
res.status(401).json({ success: false, message: 'SSO 인증 실패: 아이디 또는 비밀번호를 확인해주세요.' });
@@ -113,6 +134,17 @@ app.post('/api/send-link', async (req, res) => {
}
});
// 내 정보 확인 API
app.get('/api/me', isAuthenticated, (req, res) => {
res.json({ success: true, user: req.session.user });
});
// 로그아웃 API
app.post('/api/logout', (req, res) => {
req.session.destroy();
res.json({ success: true, message: '로그아웃 되었습니다.' });
});
// OIDC Callback (모바일 앱 리디렉션 등 처리용)
app.get('/callback', (req, res) => {
const params = oidcClient.callbackParams(req);