사용자 관리
조직에서 사용자를 추가, 편집 및 제거합니다. 역할, 팀 할당을 관리하고 개별 진행 상황을 모니터링합니다.
사용자 목록
사용자 페이지는 정렬 및 검색 가능한 테이블에 모든 조직 구성원을 표시합니다. 각 행은 사용자의 이름, 이메일, 팀, 역할 및 마지막 로그인을 표시합니다. 비활성화된 사용자는 작은 DISABLED 칩으로 인라인 플래그됩니다 — 별도의 상태 컬럼이 없습니다. 페이지 상단의 CSV 내보내기 버튼은 진행 상황 합계와 함께 전체 사용자 목록을 다운로드합니다.
| 컬럼 | 설명 |
|---|---|
| 이름 | 단일 표시 이름 필드입니다(이름/성으로 분할되지 않음). |
| 이메일 | 로그인 이메일 주소입니다 — 매직 코드 로그인에 사용됩니다. |
| 팀 | 사용자가 속한 팀입니다(할당되지 않은 경우 공백). |
| 역할 | org_admin 또는 learner입니다. |
| 마지막 로그인 | 사용자의 가장 최근 로그인 날짜와 시간입니다. 아직 로그인하지 않은 사용자는 공백입니다. |
사용자 추가
조직에 사용자를 추가하는 두 가지 방법이 있습니다:
수동
+ 사용자 추가를 클릭하고 사용자의 이름, 이메일, 역할(learner 또는 org_admin)과 선택적으로 팀을 입력합니다. 초대 이메일은 발송되지 않습니다. 사용자에게 로그인 URL을 직접 공유하세요. 로그인 페이지에서 매직 코드를 요청하고 우리가 이메일로 보낸 6자리 코드로 로그인합니다.
SCIM 프로비저닝
신원 공급자(Okta, Azure AD)에서 사용자를 자동으로 동기화하도록 SCIM을 설정합니다. 디렉터리가 변경됨에 따라 사용자가 자동으로 생성되고 비활성화됩니다.
좌석 한도
조직에는 플랜에 따라 최대 좌석 수가 있습니다. 해당 한도를 초과하여 사용자를 추가하면 Seat limit reached (N). Contact support to increase. 오류로 실패합니다 — 사용자 페이지 자체는 오늘날 라이브 좌석 카운터를 표시하지 않습니다. 보고서 페이지 또는 공개 API GET /api/public/v1/org를 사용하여 현재 사용자 수에 대해 maxSeats를 읽습니다.
사용자 편집
사용자 행을 클릭하여 사용자 상세 페이지를 엽니다. 편집 버튼은 조직 관리자가 다음 네 가지 속성을 변경할 수 있는 모달을 엽니다. 모든 필드는 필수이며 편집은 전체 교체로 작동합니다 — 필드를 변경하지 않으려면 현재 값을 그대로 두세요.
| 필드 | 편집 가능 |
|---|---|
| 이름 | 예 — 단일 표시 이름 필드입니다. |
| 이메일 | 예 — 변경해도 이메일이 다시 발송되지 않습니다. |
| 역할 | 예 — learner ↔ org_admin입니다. |
| 팀 | 예 — 팀을 선택하거나 할당하지 않은 상태로 두세요. |
| 비밀번호 | 아니오 — 비밀번호 필드가 없습니다. 사용자는 매직 코드 또는 SSO로 로그인합니다. 관리자가 설정하거나 재설정할 것은 없습니다. |
사용자 제거
사용자 상세 페이지의 제거 작업은 사용자 레코드 자체를 삭제합니다. 일단 제거되면 해당 사람은 더 이상 로그인할 수 없습니다. 사용자 제거는 maxSeats 한도에 대해 좌석을 해제합니다.
사용자의 과거 데이터 — 연습 챌린지 결과, 학습 시나리오 진행 상황, 과제 완료, 획득한 인증서 — 는 데이터베이스에서 지워지지 않습니다. 해당 테이블이 사용자 레코드와 함께 캐스케이드 삭제되지 않기 때문입니다. 그러나 실제로 해당 데이터는 보이지 않게 됩니다: 모든 보고서, 리더보드, 인증서 검증 및 사용자 상세 페이지는 이를 표시하기 위해 사용자 레코드를 통해 조인하므로, 사용자 행이 사라지면 행은 UI가 표시하지 않는 고아로 남습니다.
제거 후 동일한 이메일을 다시 추가하면 새 내부 ID로 완전히 새로운 사용자가 생성됩니다. 이전 고아 행은 다시 첨부되지 않습니다 — 관리자 UI에 "복원" 경로가 없습니다.
증거 보존, 컴플라이언스 감사 또는 재고용 시나리오를 위해 사용자의 교육 이력을 표시 상태로 유지하려면 제거를 사용하지 마세요. SCIM을 통해 업스트림으로 사용자를 디프로비저닝하거나(비활성으로 설정하지만 사용자 행은 그대로 유지) 그냥 계정을 그대로 두세요 — 메일함이 매직 코드를 더 이상 받지 못하면 로그인할 수 없습니다.
역할
SecureCodingHub는 두 가지 조직 수준 역할을 지원합니다:
| 역할 | 수행 가능 작업 |
|---|---|
| 조직 관리자 | 사용자, 팀, 과제 관리, 대시보드 보기, SSO/SCIM/SCORM 구성 |
| 학습자 | 챌린지 완료, 자신의 진행 상황 보기, 설정 관리 |
좌석 관리
조직에는 구독 플랜에 의해 결정된 maxSeats 한도가 있습니다. 오늘날 사용자 페이지 헤더에 라이브 좌석 카운터가 없습니다. 사용량을 모니터링해야 하는 경우, 공개 API(GET /api/public/v1/org는 maxSeats를 반환함)에서 읽고 현재 사용자 수와 비교하세요. 추가 좌석이 필요한 경우 한도를 높이려면 계정 관리자에게 문의하세요.
사용자 목록 인터페이스
사용자 관리 페이지는 다음과 같습니다:
사용자 추가 모달
+ 사용자 추가를 클릭하면 다음 양식이 열립니다. 역할 선택기는 드롭다운 대신 나란히 배치된 두 개의 카드를 사용합니다:
사려 깊은 사용자 관리가 중요한 이유
대부분의 조직은 갱신 청구서에 나타날 때까지 좌석 스프롤을 알아차리지 못합니다. 몇 명의 계약직이 프로젝트를 완료하고 디렉터리에 남아 있습니다. 팀이 재구성되고 이전 팀 멤버십은 결코 정리되지 않습니다. 두 명의 엔지니어가 회사를 떠나지만 오프보딩 티켓이 교육 플랫폼을 놓쳤습니다. 1년 이내에 재무 팀이 지불하는 좌석의 20%는 로그인하지 않는 사람들에게 속하며, 남아 있는 계정은 오늘 실제로 팀에 있는 사람을 반영하지 않습니다.
좌석 스프롤은 또한 보안 문제입니다. 모든 비활성 계정은 공격자가 비밀번호 재사용, 피싱 또는 세션 하이재킹을 통해 타깃으로 삼을 수 있는 자격 증명입니다. 코드 리뷰 플랫폼에 액세스를 부여하는 동일한 SSO가 여기에 액세스를 부여할 수 있으며, 아무도 보지 않는 계정은 조용히 침해되기 가장 쉽습니다. 사용자 목록을 백로그가 아니라 살아있는 아티팩트로 취급하면 사건이 되기 전에 그 갭을 닫습니다.
분기별 사용자-팀 매핑 감사
간단한 분기별 검토는 명단을 정직하게 유지합니다. 사용자 목록을 내보내고, 마지막 로그인이 90일 이전인 항목을 필터링하고, 라인 매니저에게 각 사람이 남아야 하는지 묻습니다. 팀 컬럼을 HR 시스템 또는 조직도와 교차 확인하세요 — 팀 멤버십이 더 이상 실제 역할과 일치하지 않는 사람은 재할당의 후보입니다. 팀이 설정되지 않은 사용자에게 특별한 주의를 기울이세요. 그들은 일반적으로 팀 수준 과제를 빠져나가고 아무도 알아차리지 못한 채 완료율을 낮추기 때문입니다.
SCIM 프로비저닝을 사용하는 경우, 이 작업의 대부분이 자동으로 발생합니다. Okta 또는 Azure AD의 그룹 멤버십이 팀 매핑으로 흐르며, 신원 공급자에서 사용자를 디프로비저닝하면 다음 동기화 주기에서 SecureCodingHub에서 비활성화됩니다. 그러면 감사는 수동 조정이 아니라 정상 점검이 됩니다.
디프로비저닝이 컴플라이언스 증거에 중요한 이유
PCI DSS 8.1.3 및 ISO 27001 통제 A.9.2.6 둘 다 종료된 사용자에 대한 액세스가 신속하게 취소되어야 함을 요구합니다. 감사관은 증거를 찾습니다 — 계정이 로그인할 수 없게 된 시점을 보여주는 타임스탬프 이벤트로, 이상적으로 HR의 오프보딩 날짜와 연결됩니다. 제거 버튼은 액세스 취소를 충족하지만 사용자 레코드도 삭제하므로, 완료된 교육이 보고서에서 보이지 않게 됩니다 — 행은 여전히 고아로 존재하지만 UI가 표시하지 않습니다. 감사에 해당 이력이 증거로 계속 표시되어야 하는 경우, 제거를 사용하는 대신 SCIM을 통해 디프로비저닝하세요(계정을 비활성으로 설정하면서 사용자 레코드를 그대로 유지). 감사 로그는 두 작업 중 하나를 기록합니다.
PCI DSS 6.2.2 증거 패키지의 일부로 안전 코딩 교육을 실행하는 팀의 경우, 사용자 목록은 감사 기간 동안 범위에 있었던 사람의 증거 역할도 합니다. 감사 시 스냅샷을 가져옵니다 — CSV 내보내기 버튼 또는 공개 API에서 — 그리고 증거 패키지의 나머지 부분과 함께 보관합니다.