Mastering Silent Re-Authentication in OIDC: A Practical Guide
은 iframe에서 OP(Authorization Server)의 /authorize 엔드포인트를 prompt=none으로 호출해, 기존 세션이 있으면 토큰만 갱신하고 화면 전환은 없다. 세션이 없거나 동의가 필요하면 반드시 실패로 돌아오며, 이때만 표면 로그인 플로우를 밟으면 된다.
배경 로그인으로 UX 개선하기
브라우저에서 SSO 유지·자동 재인증을 매끄럽게 만드는 핵심 방법을 하나 소개한다: **OIDC prompt=none 기반의 “사일런트 로그인( silent re‑auth )”**이다. 한 줄 요약: 숨은 iframe에서 OP(Authorization Server)의 /authorize 엔드포인트를 prompt=none으로 호출해, 기존 세션이 있으면 토큰만 갱신하고 화면 전환은 없다. 세션이 없거나 동의가 필요하면 반드시 실패로 돌아오며, 이때만 표면 로그인 플로우를 밟으면 된다.
왜 쓰나
- 메인 앱 뷰를 리다이렉트하지 않고 백그라운드로 토큰 갱신이 가능하다.
- 탭을 여러 개 띄워도 사용자 체감 끊김이 없다.
- 사용자 상호작용이 필요 없어야 하므로, 이미 OP 세션이 존재할 때만 성공한다.
동작 개요
- SPA/BFF 어디서든 **OIDC 표준
/authorize*에 기존과 동일한 파라미터를 쓰되,prompt=none을 추가한다.
- 이 호출은 숨은 iframe에서 진행한다.
- 성공 → 코드(또는 토큰) 반환 → PKCE 교환 → 새 Access Token/ID Token 확보.
- 실패(
login_required,consent_required등) → 표면 로그인 화면으로 전환.
최소 구현 예시 (SPA, 코드+PKCE, iframe)
실무 체크리스트
- 쿠키 정책: OP의 세션 쿠키가 서드파티 컨텍스트로 평가되면
SameSite=None; Secure가 아니면 iframe에서 못 읽는다. 최신 브라우저는 기본적으로 서드파티 쿠키를 제한한다.
- 토큰 저장소: XSS 예방을 위해 가능하면 쿠키(HTTPOnly) + BFF 패턴을 권장한다. 순수 SPA는 메모리 저장 + 짧은 만료 + 재시도가 안전하다.
- 오류 분기:
login_required,interaction_required,consent_required발생 시 즉시 정상 로그인 플로우로 전환한다.
- 주기: 만료 1~5분 전 탭 가시성/활동 이벤트(e.g.,
visibilitychange)와 결합해 시도하면 UX가 매끄럽다.
- 보안 헤더:
frame-ancestors(CSP)와 OP의 allowed iframe origins 설정을 맞춘다.
- max_age / id_token_hint: 최근 로그인 컨텍스트를 명시하면 성공률이 오른다.
- PKCE 필수: SPA는 항상 PKCE를 사용한다.
언제 대안이 더 좋은가
- 서드파티 쿠키가 막힌 환경(사내 정책/브라우저 설정)에서는 성공률이 떨어진다.
→ BFF(Backend‑for‑Frontend) + Refresh Token Rotation으로 서버에서 갱신하는 구성이 가장 견고하다.
- 멀티 도메인(HunyDev의
.huny.dev+ 외부 도메인 혼용)이라면 공통 최상위 도메인으로 리디렉트 기반 프론트채널 로그인 또는 Back‑channel + BFF가 유지보수에 유리하다.