n8n: OIDC SSO 버튼 미노출 버그 기록, envFrom 누락 수정 및 Helm 드리프트 위험 문서화
This commit is contained in:
46
history/2026-07-11-n8n-oidc-secret-not-wired.md
Normal file
46
history/2026-07-11-n8n-oidc-secret-not-wired.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
title: n8n OIDC SSO 버튼 미노출 (envFrom 누락)
|
||||||
|
updated: 2026-07-11
|
||||||
|
tags: [history, incident, n8n, oidc]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 증상
|
||||||
|
|
||||||
|
`https://n8n.inouter.com` 접속 시 HTTP 200으로 페이지는 뜨지만 "Sign in with SSO" 버튼 없이 로컬 이메일/비밀번호 폼만 표시됨. `/assets/oidc-frontend-hook.js` 요청 시 404.
|
||||||
|
|
||||||
|
[[2026-07-11-pgpool-stale-primary-n8n-outage|pgpool 장애]] 복구 직후 사용자가 "빈 화면만 나온다"고 보고 — 재현해보니 실제로는 정상 로드되었고(pgpool 복구 직후라 캐시/타이밍 이슈로 추정), 대신 이 SSO 버그를 발견.
|
||||||
|
|
||||||
|
## 원인
|
||||||
|
|
||||||
|
n8n 로그: `[OIDC Hook] Missing configuration: OIDC_CLIENT_ID, OIDC_CLIENT_SECRET. OIDC disabled.`
|
||||||
|
|
||||||
|
`OIDC_CLIENT_ID`/`OIDC_CLIENT_SECRET`은 `n8n-oidc-secret` Secret에 존재하지만, n8n Deployment의 `envFrom`은 `n8n-app-config`(ConfigMap) + `n8n-app-secret`(Secret, DB 비밀번호만 포함)만 참조 — `n8n-oidc-secret`이 어디에도 연결되어 있지 않았음.
|
||||||
|
|
||||||
|
[[../services/n8n#배포-구조-—-helm--수동-패치-혼재-주의|n8n.md]] 참조 — OIDC 관련 리소스는 Helm chart values 외부에서 수동으로 추가된 구조라 `helm get values`로는 안 보임. 최초 OIDC 세팅 시([[../services/n8n]] 작성일 2026-04-16 추정) `n8n-oidc-secret`을 만들고 hooks ConfigMap/volume은 연결했지만 envFrom 배선을 빠뜨린 것으로 보임 — 즉 **OIDC SSO가 처음부터 한 번도 정상 동작한 적이 없었을 가능성**.
|
||||||
|
|
||||||
|
## 조치
|
||||||
|
|
||||||
|
```bash
|
||||||
|
kubectl -n n8n patch deployment n8n --type=json -p='[{"op": "add", "path": "/spec/template/spec/containers/0/envFrom/-", "value": {"secretRef": {"name": "n8n-oidc-secret"}}}]'
|
||||||
|
```
|
||||||
|
|
||||||
|
재기동 후 로그 확인:
|
||||||
|
```
|
||||||
|
[OIDC Hook] Initializing OIDC authentication...
|
||||||
|
[OIDC Hook] OIDC routes registered:
|
||||||
|
- GET /auth/oidc/login
|
||||||
|
- GET /auth/oidc/callback
|
||||||
|
- GET /assets/oidc-frontend-hook.js
|
||||||
|
```
|
||||||
|
|
||||||
|
브라우저에서 "Sign in with SSO" 버튼 노출 확인 완료. (kubectl patch만 적용 — Helm 값에는 반영 안 됨, 위 드리프트 위험 참조)
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
- [ ] 실제 Gitea OIDC 로그인 플로우 end-to-end 테스트 (버튼만 확인했고 로그인 자체는 미검증)
|
||||||
|
- [ ] helm upgrade 시 이 patch가 유지되는지 확인 절차 필요 — 가능하면 `main.extraEnvFrom` 같은 chart 지원 값으로 이전 검토, 안 되면 최소한 upgrade 후 체크리스트에 추가
|
||||||
|
|
||||||
|
## 관련
|
||||||
|
|
||||||
|
- [[../services/n8n]]
|
||||||
|
- [[2026-07-11-pgpool-stale-primary-n8n-outage]]
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: n8n
|
title: n8n
|
||||||
updated: 2026-04-16
|
updated: 2026-07-11
|
||||||
tags: [services, n8n, oidc, gitea]
|
tags: [services, n8n, oidc, gitea]
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -42,6 +42,13 @@ EXTERNAL_FRONTEND_HOOKS_URLS=/assets/oidc-frontend-hook.js
|
|||||||
- confidential client: yes
|
- confidential client: yes
|
||||||
- Gitea admin → Settings → Applications 에서 관리
|
- Gitea admin → Settings → Applications 에서 관리
|
||||||
|
|
||||||
|
### 배포 구조 — Helm + 수동 패치 혼재 (주의)
|
||||||
|
|
||||||
|
n8n은 Helm release(`n8n-2.0.1`, chart 자체는 OIDC 애드온 미지원)로 설치되어 있으나, OIDC 관련 리소스(`n8n-oidc-secret`, `n8n-oidc-hooks` ConfigMap, `n8n-app-config`의 OIDC 관련 키, hooks volume mount, `envFrom` 항목)는 설치 후 `kubectl apply`/`kubectl patch`로 **Helm 값 외부에서 수동 추가**됨. `helm get values n8n`에는 이 내용이 전혀 안 보임.
|
||||||
|
|
||||||
|
- **드리프트 위험**: `helm upgrade`를 values 변경 없이 재실행하면 Deployment가 chart 템플릿대로 재렌더링되면서 수동 patch (`envFrom`의 `n8n-oidc-secret` secretRef 등)가 **되돌아갈 수 있음**. OIDC 관련 변경 후에는 반드시 `kubectl -n n8n get deployment n8n -o yaml`로 envFrom/volumeMounts 유지 여부 확인할 것.
|
||||||
|
- `envFrom` 순서(2026-07-11 기준): `configMapRef n8n-app-config` → `secretRef n8n-app-secret` → `secretRef n8n-oidc-secret`
|
||||||
|
|
||||||
### 동작
|
### 동작
|
||||||
|
|
||||||
1. n8n 로그인 페이지에 "Sign in with SSO" 버튼 표시
|
1. n8n 로그인 페이지에 "Sign in with SSO" 버튼 표시
|
||||||
|
|||||||
Reference in New Issue
Block a user