보안 감사 결과 CRITICAL 2건, HIGH 5건 발견 → 수정 완료 + 자동화 구축. [보안 수정] - issue-view.js: 하드코딩 비밀번호 → crypto.getRandomValues() 랜덤 생성 - pushSubscriptionController.js: ntfy 비밀번호 → process.env.NTFY_SUB_PASSWORD - DEPLOY-GUIDE.md/PROGRESS.md/migration SQL: 평문 비밀번호 → placeholder - docker-compose.yml/.env.example: NTFY_SUB_PASSWORD 환경변수 추가 [보안 강제 시스템 - 신규] - scripts/security-scan.sh: 8개 규칙 (CRITICAL 2, HIGH 4, MEDIUM 2) 3모드(staged/all/diff), severity, .securityignore, MEDIUM 임계값 - .githooks/pre-commit: 로컬 빠른 피드백 - .githooks/pre-receive-server.sh: Gitea 서버 최종 차단 bypass 거버넌스([SECURITY-BYPASS: 사유] + 사용자 제한 + 로그) - SECURITY-CHECKLIST.md: 10개 카테고리 자동/수동 구분 - docs/SECURITY-GUIDE.md: 운영자 가이드 (워크플로우, bypass, FAQ) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
40 lines
1.5 KiB
JavaScript
40 lines
1.5 KiB
JavaScript
/**
|
||
* SSO Token Relay — 인앱 브라우저(카카오톡 등) 서브도메인 쿠키 미공유 대응
|
||
*
|
||
* Canonical source: shared/frontend/sso-relay.js
|
||
* 전 서비스 동일 코드 — 수정 시 아래 파일 <20><><EFBFBD>체 갱신 필요:
|
||
* system1-factory/web/js/sso-relay.js
|
||
* system2-report/web/js/sso-relay.js
|
||
* system3-nonconformance/web/static/js/sso-relay.js
|
||
* user-management/web/static/js/sso-relay.js
|
||
* tkpurchase/web/static/js/sso-relay.js
|
||
* tksafety/web/static/js/sso-relay.js
|
||
* tksupport/web/static/js/sso-relay.js
|
||
*
|
||
* 동작: URL hash에 _sso= 파라미터가 있으면 토큰을 로컬 쿠키+localStorage에 설정하고 hash를 제거.
|
||
* gateway/dashboard.html에서 로그인 성공 후 redirect URL에 #_sso=<token>을 붙여 전달.
|
||
*/
|
||
(function() {
|
||
var hash = location.hash;
|
||
if (!hash || hash.indexOf('_sso=') === -1) return;
|
||
|
||
var match = hash.match(/[#&]_sso=([^&]*)/);
|
||
if (!match) return;
|
||
|
||
var token = decodeURIComponent(match[1]);
|
||
if (!token) return;
|
||
|
||
// 로컬(1st-party) 쿠키 설정
|
||
var cookie = 'sso_token=' + encodeURIComponent(token) + '; path=/; max-age=604800';
|
||
if (location.hostname.indexOf('technicalkorea.net') !== -1) {
|
||
cookie += '; domain=.technicalkorea.net; secure; samesite=lax';
|
||
}
|
||
document.cookie = cookie;
|
||
|
||
// localStorage 폴백
|
||
try { localStorage.setItem('sso_token', token); } catch (e) {}
|
||
|
||
// URL에서 hash 제거
|
||
history.replaceState(null, '', location.pathname + location.search);
|
||
})();
|