다크 모드
SSO (OIDC)
회사 IdP(Okta · Microsoft Entra ID · Google Workspace · Keycloak 등 OpenID Connect 지원 IdP) 계정으로 ISMS Doctor 에 로그인합니다.
누가 설정하나요
IdP 연결과 도메인 확인은 조직 소유자(OWNER), 처음 들어온 사람의 접근 요청 승인은 조직 관리자(ADMIN) 이상이 합니다.
동작 방식
- 로그인 화면의 회사 SSO 로 로그인 에 회사 이메일을 넣으면, 그 도메인을 확인한 조직의 IdP 로 이동합니다.
- IdP 로그인이 끝나면 ISMS Doctor 가 ID 토큰(서명·발급자·대상·만료·nonce) 을 검증하고, 이 조직의 멤버만 로그인시킵니다.
- 2단계 인증을 켠 사용자는 SSO 뒤에도 인증 앱 코드를 입력합니다.
- IdP 에서 시작하는 로그인(IdP-initiated) 은 지원하지 않습니다 — 항상 ISMS Doctor 로그인 화면에서 시작합니다.
1. 이메일 도메인 확인
SSO 로 들어오는 이메일의 도메인은 조직이 DNS 로 소유를 확인한 도메인이어야 합니다. 확인 없이 도메인을 주장할 수 있으면 다른 회사 이메일을 내세우는 IdP 로 남의 계정에 들어갈 수 있기 때문입니다.
설정 › 조직 › SSO (OIDC) 에서 도메인(예:
acme.co.kr)을 추가합니다.화면에 나온 TXT 레코드를 DNS 에 등록합니다.
이름 값 _ismsdoctor-verification.acme.co.krismsdoctor-verification=<발급된 토큰>몇 분 뒤 확인 을 누릅니다.
- 무료 메일 도메인(gmail.com · naver.com 등)은 등록할 수 없습니다.
- 한 도메인은 한 조직만 확인할 수 있습니다. 이미 다른 조직이 확인한 도메인이라면 지원팀에 문의하세요.
- 확인된 도메인을 모두 지우면 SSO 가 자동으로 꺼집니다.
2. IdP 에 앱 등록
IdP 에서 OIDC 웹 애플리케이션(authorization code 방식)을 만들고 다음을 설정합니다.
| 항목 | 값 |
|---|---|
| Redirect URI (Sign-in redirect) | 설정 화면에 표시된 주소 (예: https://<도메인>/api/auth/sso/callback) |
| Scope | openid email profile |
| Grant type | Authorization Code (PKCE 는 ISMS Doctor 가 자동으로 붙입니다) |
발급된 Issuer URL · Client ID · Client secret 을 ISMS Doctor 설정 화면에 입력하고 저장합니다.
| IdP | Issuer URL 예시 |
|---|---|
| Okta | https://<회사>.okta.com (커스텀 인증 서버라면 https://<회사>.okta.com/oauth2/default) |
| Microsoft Entra ID | https://login.microsoftonline.com/<테넌트 ID>/v2.0 |
| Google Workspace | https://accounts.google.com |
| Keycloak | https://<호스트>/realms/<realm> |
- Client secret 은 KMS 로 암호화해 저장하며 다시 표시하지 않습니다. 바꿀 때만 새로 입력하세요.
- 저장할 때 Issuer 의
/.well-known/openid-configuration을 읽어 설정을 확인합니다. Issuer 는 https 여야 하고, 문서 안의 issuer 값이 입력값과 정확히 같아야 합니다. - ID 토큰에
email클레임이 있어야 합니다 (preferred_username은 쓰지 않습니다). Microsoft Entra ID 는 앱 등록 › 토큰 구성에서 선택적 클레임email을 추가하세요. - 이메일 확인 여부: 처음 연결(기존 멤버와 묶기)·접근 요청은 IdP 가
email_verified=true를 보낼 때만 합니다. Entra ID 처럼 이 값을 보내지 않는 IdP 라면 "IdP 가 이메일 확인 여부를 보내지 않아도 이메일을 신뢰" 를 켜세요 — IdP 관리자만 사용자 이메일을 바꿀 수 있는 경우에만 켜야 합니다. - Issuer 나 Client ID 를 바꾸면(다른 IdP 로 이전) 기존 SSO 연결과 대기 중인 접근 요청이 해제됩니다. IdP 계정 식별자(sub)는 IdP 안에서만 유일해서, 새 IdP 의 다른 사람이 옛 연결로 들어오지 않게 하기 위해서입니다. 멤버는 다음 SSO 로그인 때 다시 연결됩니다.
3. 켜기 · 멤버가 아닌 사람 처리
SSO 사용 을 체크하고 저장하면 켜집니다 (확인된 도메인이 하나 이상 필요).
멤버가 아닌 사람이 SSO 로 들어왔을 때:
| 설정 | 동작 |
|---|---|
| 접근 요청으로 받고 관리자가 승인 (기본) | 로그인 대신 "접근 요청을 보냈습니다" 안내. 관리자가 설정 화면에서 역할(뷰어·관리자)을 골라 승인하면 다음 로그인부터 들어옵니다. 좌석 한도를 넘으면 승인되지 않습니다. 거절한 사람이 다시 SSO 로 들어오면 요청이 대기 목록에 다시 올라옵니다. |
| 거부 (초대한 멤버만) | 로그인을 거부합니다. 멤버는 기존처럼 초대로 추가합니다. |
보안 참고
- 한 사람의 IdP 계정(sub)은 첫 로그인 때 ISMS Doctor 사용자와 묶입니다. 나중에 IdP 에서 같은 이메일이 다른 계정에 재할당되어도 기존 사용자로 들어올 수 없습니다 (로그인 화면에 "이미 다른 SSO 계정과 연결" 안내).
- IdP 가 이메일을 확인되지 않은 것으로 표시(
email_verified=false)하면 거부합니다. 값을 보내지 않으면 조직 설정("이메일을 신뢰") 에 따릅니다. - 회원 탈퇴한 사용자의 SSO 연결·접근 요청은 탈퇴와 함께 지워집니다.
- 지원 서명 알고리즘: RS256 · PS256 · ES256.
- SSO 설정 변경·도메인 추가/확인/삭제·접근 요청 승인/거절·SSO 로그인은 감사 로그에 남습니다. 2단계 인증 사용자는 IdP 통과(
auth.sso.first_factor) 로 따로 남고, 로그인 성공(auth.sso.login) 은 세션을 발급할 때만 기록합니다. - 현재는 SSO 를 켜도 이메일·비밀번호 로그인이 막히지 않습니다 (SSO 강제는 추후 제공).
- SAML 은 아직 지원하지 않습니다.
문제 해결
| 로그인 화면 안내 | 원인 · 조치 |
|---|---|
| SSO 로그인 시간이 지났거나 요청이 올바르지 않습니다 | 10분 안에 IdP 로그인을 끝내지 못했거나 다른 탭에서 새로 시작했습니다. 처음부터 다시 시도하세요. |
| IdP 가 이메일 확인 여부를 알려주지 않아 계정을 연결하지 않았습니다 | IdP 가 email_verified 를 보내지 않습니다. IdP 설정을 확인하거나, IdP 관리자만 이메일을 바꿀 수 있다면 SSO 설정의 "이메일을 신뢰" 를 켜세요. |
| SSO 로그인 시도가 너무 많습니다 | 같은 IP 에서 1분에 60번을 넘었습니다. 잠시 후 다시 시도하세요. |
| SSO 로그인에 실패했습니다 | IdP 설정(Redirect URI · Client secret · Issuer) 이 맞는지 확인하세요. 서버 로그의 [sso.callback] failed: 뒤에 원인이 남습니다. |
| IdP 가 알려준 이메일이 이 조직이 확인한 도메인이 아닙니다 | IdP 계정의 이메일 도메인을 확인하거나 해당 도메인을 추가·확인하세요. |
| 이 조직의 멤버가 아닙니다 | "거부" 모드입니다. 관리자가 초대하거나 "접근 요청" 모드로 바꾸세요. |