fix(security): SSO 데드쿠키 제거 + open redirect 방어 + system2 수정
- SSO auth: 서버측 httpOnly 쿠키 제거 (클라이언트 domain cookie로 대체) - SSO auth: extractToken()에서 미작동 req.cookies 코드 제거 - Gateway login.html: redirect 파라미터 open redirect 취약점 방어 - System 2: 인라인 requireAuth → middlewares/auth.js 사용 - System 2: 404/에러 핸들러 등록 순서 수정 (Express 모범사례) - .gitignore: *.bak* 패턴 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -65,14 +65,8 @@ async function login(req, res, next) {
|
||||
{ expiresIn: JWT_REFRESH_EXPIRES_IN }
|
||||
);
|
||||
|
||||
// SSO 쿠키 설정 (동일 도메인 공유)
|
||||
res.cookie('sso_token', access_token, {
|
||||
httpOnly: true,
|
||||
secure: process.env.NODE_ENV === 'production',
|
||||
sameSite: 'lax',
|
||||
maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days
|
||||
path: '/'
|
||||
});
|
||||
// SSO 쿠키는 클라이언트(login.html)에서 domain=.technicalkorea.net으로 설정
|
||||
// 서버 httpOnly 쿠키는 서브도메인 공유 불가하므로 제거
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
@@ -237,14 +231,6 @@ async function refresh(req, res, next) {
|
||||
{ expiresIn: JWT_REFRESH_EXPIRES_IN }
|
||||
);
|
||||
|
||||
res.cookie('sso_token', access_token, {
|
||||
httpOnly: true,
|
||||
secure: process.env.NODE_ENV === 'production',
|
||||
sameSite: 'lax',
|
||||
maxAge: 7 * 24 * 60 * 60 * 1000,
|
||||
path: '/'
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
access_token,
|
||||
@@ -335,15 +321,11 @@ async function deleteUser(req, res, next) {
|
||||
* Bearer 토큰 또는 쿠키에서 토큰 추출
|
||||
*/
|
||||
function extractToken(req) {
|
||||
// Authorization header
|
||||
// Authorization header (SSO 토큰은 항상 Bearer로 전달)
|
||||
const authHeader = req.headers['authorization'];
|
||||
if (authHeader && authHeader.startsWith('Bearer ')) {
|
||||
return authHeader.split(' ')[1];
|
||||
}
|
||||
// Cookie
|
||||
if (req.cookies && req.cookies.sso_token) {
|
||||
return req.cookies.sso_token;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user