사용자 관리
개요
이 문서에서는 PlantPulse 플랫폼의 사용자 계정, 보안 그룹, 권한 관리 방법을 안내합니다.
사용자 관리는 좌측 메뉴 System > 사용자 (/user/index) 에서 수행합니다.
사용자 구조
PlantPulse의 사용자 관리는 세 가지 핵심 요소로 구성됩니다.
- 사용자(User): 플랫폼에 로그인하는 개별 계정입니다.
- 보안 그룹(Security Group): 사용자의 역할을 정의하는 그룹입니다. 각 사용자는 하나의 보안 그룹에 속합니다.
- 권한(Permission): 보안 그룹에 할당된 기능별 접근 권한입니다. 메뉴, 화면, API에 대한 접근을 제어합니다.
역할 3종
제품이 제공하는 역할은 셋뿐입니다.
| 역할 | 화면 표시 | 용도 |
|---|---|---|
ADMIN | 시스템 관리자 | 전체 기능. 타인 비밀번호 변경·사용자 관리 가능 |
API | API 개발자 | 외부 시스템 연동 계정 |
USER | 일반 사용자 | 기본 기능 |
예전 문서에 이 이름들이 실려 있었지만 제품에 존재하지 않는 역할입니다. 사용자 등록
화면의 역할 선택지에도 나오지 않습니다. MANAGER 도 마찬가지입니다.
최소 권한 원칙: 사람이 쓰는 계정은
USER로 시작하고, 관리가 필요한 사람에게만ADMIN을 주세요.
사용자 속성
| 속성 | 필수 | 설명 |
|---|---|---|
| 사용자 ID | O | 로그인에 사용하는 고유 식별자 (영문, 숫자, 4~20자) |
| 사용자 이름 | O | 화면에 표시되는 이름 |
| 비밀번호 | O | 로그인 비밀번호 (12~50자, 아래 비밀번호 정책 참고) |
| 이메일 | - | 알림 수신 이메일 주소 |
| 역할 | O | ADMIN / API / USER 중 하나 |
| 상태 | O | 활성(Active) 또는 비활성(Inactive) |
| 설명 | - | 사용자에 대한 메모 |
| 생성일 | 자동 | 계정 생성 일시 |
| 최종 로그인 | 자동 | 마지막 로그인 일시 |
사용자 목록 조회
좌측 메뉴 System > 사용자 를 선택하면 등록된 사용자 목록을 확인할 수 있습니다.
- URL:
/user/index - 사용자 ID, 이름, 보안 그룹, 상태, 최종 로그인 일시를 확인할 수 있습니다.
- 검색 필터를 사용하여 특정 사용자를 빠르게 찾을 수 있습니다.
안내: 사용자 목록은 ADMIN 보안 그룹에 속한 사용자만 조회할 수 있습니다.
사용자 추가
- 사용자 목록 화면에서 추가 버튼을 클릭합니다.
- 필수 항목을 입력합니다.
- 사용자 ID: 영문과 숫자로 구성된 고유 ID (4~20자)
- 사용자 이름: 화면에 표시될 이름
- 비밀번호: 12~50자이면서 영문 대문자·소문자·숫자·특수문자 4종 중 3종 이상을 포함해야 합니다. 미달이면 저장이 거부됩니다.
- 역할:
ADMIN/API/USER중 하나를 선택합니다.
- 선택 항목 (이메일, 설명 등)을 필요에 따라 입력합니다.
- 저장 버튼을 클릭합니다.
참고: 사용자 ID는 생성 후 변경할 수 없습니다. 신중하게 설정해 주세요.
사용자 수정
- 사용자 목록에서 수정할 사용자를 클릭합니다.
- 수정 가능한 항목을 변경합니다 (이름, 이메일, 보안 그룹, 상태, 설명 등).
- 저장 버튼을 클릭합니다.
안내: 사용자 ID는 수정할 수 없습니다. ID를 변경하려면 기존 사용자를 삭제하고 새로 생성해야 합니다.
사용자 삭제
- 사용자 목록에서 삭제할 사용자를 선택합니다.
- 삭제 버튼을 클릭합니다.
- 확인 팝업에서 확인을 클릭합니다.
주의: 삭제된 사용자는 복구할 수 없습니다. 사용자를 일시적으로 차단하려면 삭제 대신 비활성화를 사용하는 것을 권장합니다.
사용자 비활성화
사용자 계정을 삭제하지 않고 로그인을 차단하려면 비활성화 기능을 사용합니다.
- 사용자 수정 화면에서 상태를
Inactive로 변경합니다. - 저장 버튼을 클릭합니다.
비활성화된 사용자는 로그인이 차단되지만 데이터(감사 로그, 설정 이력 등)는 그대로 유지됩니다. 다시 활성화하려면 상태를 Active로 변경해 주세요.
비밀번호 관리
비밀번호는 화면 한 곳에서 바꿉니다 — 좌측 메뉴 System > 사용자 목록입니다.
비밀번호 변경 (기본 비밀번호 교체)
설치 직후 기본 비밀번호를 바꾸는 방법이 이것입니다.
- 좌측 메뉴 System > 사용자 를 엽니다.
- 대상 사용자 행의 🔑 열쇠 아이콘 을 클릭합니다 (툴팁: "비밀번호 변경").
- 새 비밀번호를 입력합니다. 본인 계정이면 현재 비밀번호도 함께 입력해야 합니다.
- 저장합니다.
누가 누구의 비밀번호를 바꿀 수 있는지는 규칙이 정해져 있습니다.
| 대상 | 필요 권한 | 현재 비밀번호 확인 |
|---|---|---|
| 본인 | 없음 (로그인만 되어 있으면) | 필수 — 틀리면 거부 |
| 다른 사용자 | ADMIN | 불필요 |
ADMIN이 아닌 사용자가 남의 비밀번호를 바꾸려 하면 거부되고 서버 로그에 감사 기록이 남습니다. 성공한 변경도Password changed: session_user=[...], target_user=[...]형태로 기록됩니다.
REST API 로도 같은 일을 할 수 있습니다.
POST /api/v5/user/{user_id}/password
Content-Type: application/json
{ "current_password": "<현재 비밀번호>", "password": "<새 비밀번호>" }
비밀번호 분실 처리
- 관리자에게 요청:
ADMIN사용자가 위 절차로 초기화해 줍니다. - DB 직접 초기화 (비상 시):
ADMIN계정까지 전부 잠긴 경우에만 씁니다.
비밀번호는 BCrypt 해시로 저장됩니다. 예전 문서에 실려 있던
encode(digest(..., 'sha256'), 'hex') 방식으로 값을 넣으면, 로그인 시 BCrypt 검증이
그 문자열을 해석하지 못해 어떤 비밀번호로도 로그인할 수 없게 됩니다. 하필 이미
잠긴 상황에서 쓰는 절차라 복구 수단이 사라집니다.
테이블 이름도 pp_user 가 아니라 USER_LOGIN 입니다.
BCrypt 해시를 먼저 만들고, 그 값을 넣습니다.
# BCrypt 해시 생성 (htpasswd — apache2-utils / httpd-tools 패키지)
htpasswd -bnBC 10 "" '<새 비밀번호>' | tr -d ':\n'
# → $2y$10$... 형태의 문자열이 나옵니다
-- 비상 시에만. 위에서 만든 BCrypt 해시를 그대로 넣습니다.
UPDATE USER_LOGIN
SET PASSWORD = '<$2y$10$... 붙여넣기>'
WHERE USER_ID = 'admin';
넣은 직후 반드시 로그인으로 확인하고, 성공하면 화면에서 한 번 더 정상 경로로 변경하세요. 인프라 서비스 계정(PostgreSQL·Cassandra·MinIO 등)의 비밀번호는 이 문서가 아니라 비밀번호 변경 (크리덴셜 회전) 을 따르세요 — 순서를 어기면 플랫폼이 기동하지 않습니다.
비밀번호 정책
제품이 강제하는 것 — 아래를 어기면 저장 자체가 거부됩니다.
| 항목 | 값 |
|---|---|
| 길이 | 12자 이상 50자 이하 |
| 복잡도 | 영문 대문자 · 소문자 · 숫자 · 특수문자 4종 중 3종 이상 |
제품이 강제하지 않는 것 — 운영 규정으로 관리해야 합니다. 아래 항목들은 플랫폼에 기능이 없으므로, 필요하다면 조직의 절차로 챙기세요.
| 항목 | 상태 |
|---|---|
| 변경 주기 강제 · 만료 | 없음 |
| 이전 비밀번호 재사용 금지 | 없음 |
| 사전어(dictionary) 차단 | 없음 |
| 계정 영구 잠금 | 없음 — 대신 아래의 일시 차단이 있습니다 |
무차별 대입 차단 (일시 차단)
로그인 실패가 쌓이면 계정이 잠기는 것이 아니라 일정 시간 요청이 차단됩니다
(HTTP 429 + Retry-After). 시간이 지나면 저절로 풀리므로 관리자가 해제할 일은 없습니다.
| 설정 | 프로퍼티 | 기본값 |
|---|---|---|
| 기능 사용 | engine.session.bruteforce.enabled | 사용 |
| IP 당 실패 허용 | engine.session.bruteforce.ip_limit | 30회 |
| 계정 당 실패 허용 | engine.session.bruteforce.user_limit | 10회 |
| 집계 구간 | engine.session.bruteforce.window.seconds | 300초 (5분) |
차단은 IP 기준과 계정 기준 두 갈래로 각각 셉니다. 사무실처럼 여러 사람이 같은 공인 IP 를 쓰면 다른 사람의 실패가 IP 한도(30회)를 함께 채울 수 있습니다. 차단·실패는 모두 감사 로그(
LOGIN_BLOCKED/LOGIN_FAILURE)에 남습니다.
보안 그룹 관리
기본 보안 그룹
PlantPulse는 세 가지 기본 보안 그룹을 제공합니다.
| 보안 그룹 | 설명 | 주요 권한 |
|---|---|---|
| ADMIN | 시스템 관리자 | 전체 기능 접근 (사용자 관리, 시스템 설정, 모든 메뉴) |
| OPERATOR | 운영자 | 운영 관련 기능 접근 (모니터링, 알람 관리, 데이터 조회) |
| USER | 일반 사용자 | 기본 기능 접근 (대시보드 조회, 데이터 조회) |
보안 그룹 추가
기본 그룹 외에 조직의 역할에 맞는 보안 그룹을 추가할 수 있습니다.
- 보안 관리 > 보안 그룹 메뉴를 선택합니다.
- 추가 버튼을 클릭합니다.
- 그룹 ID, 그룹 이름, 설명을 입력합니다.
- 저장 버튼을 클릭합니다.
권한 설정
보안 그룹에 메뉴 및 기능별 권한을 설정합니다.
- 보안 관리 > 보안 그룹 메뉴에서 그룹을 선택합니다.
- 권한 설정 탭을 클릭합니다.
- 각 메뉴/기능에 대해 읽기, 쓰기, 삭제 권한을 체크합니다.
- 저장 버튼을 클릭합니다.
권한 설정 예시:
| 메뉴 | ADMIN | OPERATOR | USER |
|---|---|---|---|
| 연결 관리 | 읽기/쓰기/삭제 | 읽기/쓰기 | 읽기 |
| 팩토리 관리 | 읽기/쓰기/삭제 | 읽기/쓰기 | 읽기 |
| 알람 관리 | 읽기/쓰기/삭제 | 읽기/쓰기 | 읽기 |
| 사용자 관리 | 읽기/쓰기/삭제 | - | - |
| 시스템 설정 | 읽기/쓰기/삭제 | 읽기 | - |
| 캔버스 | 읽기/쓰기/삭제 | 읽기/쓰기 | 읽기 |
접근 제어
사이트 접근 제어
멀티 사이트 환경에서는 사용자별로 접근 가능한 사이트를 제한할 수 있습니다.
- 사용자 수정 화면에서 사이트 접근 권한 탭을 선택합니다.
- 접근을 허용할 사이트를 체크합니다.
- 저장 버튼을 클릭합니다.
안내: 사이트 접근 권한이 설정되지 않은 사용자는 모든 사이트에 접근할 수 있습니다.
캔버스 공유
캔버스 화면은 특정 사용자 또는 보안 그룹과 공유할 수 있습니다.
- 캔버스 편집 화면에서 공유 설정을 클릭합니다.
- 공유 대상을 선택합니다.
- 전체 공개: 모든 사용자가 접근 가능합니다.
- 보안 그룹: 선택한 보안 그룹의 사용자만 접근 가능합니다.
- 사용자 지정: 선택한 사용자만 접근 가능합니다.
- 저장 버튼을 클릭합니다.
세션 관리
세션 타임아웃
사용자의 세션 타임아웃은 기본 30분으로 설정되어 있습니다. 30분 동안 활동이 없으면 자동으로 로그아웃됩니다.
세션 타임아웃을 변경하려면 web.xml에서 설정을 수정합니다.
<!-- 웹앱 내부 WEB-INF/web.xml (WAR 에 포함 — 배포 시 초기화되므로 영구 변경은 소스에서) -->
<session-config>
<session-timeout>30</session-timeout> <!-- 분 단위 -->
</session-config>
동시 로그인
기본적으로 동일 계정으로 여러 브라우저/기기에서 동시 로그인이 가능합니다. 보안이 중요한 환경에서는 계정을 사용자별로 분리해 발급하고, 접근 IP 제한 등 네트워크 수준의 통제로 보완하는 것을 권장합니다.
감사 로그
사용자의 주요 활동은 감사 로그에 자동으로 기록됩니다. 감사 로그를 통해 시스템 변경 이력을 추적할 수 있습니다.
기록되는 활동:
| 활동 유형 | 설명 |
|---|---|
| 로그인/로그아웃 | 사용자 인증 이벤트 |
| 사용자 관리 | 사용자 생성, 수정, 삭제, 비활성화 |
| 보안 그룹 변경 | 그룹 생성, 수정, 삭제, 권한 변경 |
| 시스템 설정 변경 | 프로퍼티, 연결 정보 등 설정 변경 |
| 데이터 수정 | 팩토리, 설비, 포인트 등 마스터 데이터 변경 |
감사 로그는 도구 > 감사 로그 메뉴에서 조회할 수 있으며, 기간, 사용자, 활동 유형별로 필터링할 수 있습니다.
대량 사용자 등록
다수의 사용자를 한 번에 등록하려면 Excel 파일을 사용하여 일괄 등록할 수 있습니다.
등록 절차
- 보안 관리 > 사용자 관리 메뉴에서 Excel 업로드 버튼을 클릭합니다.
- 템플릿 Excel 파일을 다운로드합니다.
- 템플릿에 맞게 사용자 정보를 입력합니다.
| 열 | 필수 | 설명 | 예시 |
|---|---|---|---|
| user_id | O | 사용자 ID | operator01 |
| user_name | O | 사용자 이름 | 홍길동 |
| password | O | 초기 비밀번호 | Temp1234! |
| - | 이메일 | hong@example.com | |
| security_group | O | 보안 그룹 ID | OPERATOR |
| description | - | 설명 | 생산1팀 |
- 작성한 Excel 파일을 업로드합니다.
- 미리보기에서 등록할 사용자 정보를 확인합니다.
- 등록 버튼을 클릭합니다.
안내: 업로드 시 유효성 검사가 수행됩니다. 중복 ID, 필수 항목 누락 등의 오류가 있으면 해당 행이 표시되며 수정 후 재업로드할 수 있습니다.
모범 사례
- 최소 권한 원칙: 사용자에게 업무에 필요한 최소한의 권한만 부여해 주세요.
- 관리자 계정 최소화: ADMIN 그룹의 사용자는 최소한으로 유지하고, 일반 운영은 OPERATOR 그룹을 사용하세요.
- 주기적 감사: 분기별로 사용자 목록과 권한을 검토하여 불필요한 계정을 비활성화해 주세요.
- 퇴직자 처리: 퇴직 시 즉시 계정을 비활성화하거나 삭제해 주세요.
- 공유 계정 금지: 개인별 계정을 사용하고, 공유 계정 사용은 지양해 주세요.
- 비밀번호 관리: 초기 비밀번호는 반드시 변경하도록 안내하고, 정기적인 비밀번호 변경을 유도해 주세요.
- 로그 모니터링: 비정상적인 로그인 시도(반복 실패, 비정상 시간대 접근 등)를 모니터링해 주세요.
자주 발생하는 문제
로그인 실패
| 증상 | 원인 | 해결 방법 |
|---|---|---|
| "사용자 ID 또는 비밀번호가 잘못되었습니다" | 잘못된 비밀번호 입력 | 비밀번호를 확인하고 다시 시도해 주세요. Caps Lock 상태도 확인해 주세요. |
| "비활성화된 계정입니다" | 계정이 Inactive 상태 | 관리자에게 계정 활성화를 요청해 주세요. |
| "계정이 잠겼습니다" | 로그인 연속 실패로 잠금 | 관리자에게 잠금 해제를 요청해 주세요. |
| 로그인 화면이 표시되지 않음 | 웹서버 미실행 또는 네트워크 문제 | 서버 상태와 네트워크 연결을 확인해 주세요. |
권한 부족
| 증상 | 원인 | 해결 방법 |
|---|---|---|
| 메뉴가 보이지 않음 | 보안 그룹에 해당 메뉴 접근 권한 없음 | 관리자에게 권한 추가를 요청해 주세요. |
| "접근 권한이 없습니다" 메시지 | API 또는 기능 권한 부족 | 보안 그룹의 권한 설정을 확인해 주세요. |
| 특정 사이트 데이터 미표시 | 사이트 접근 권한 미설정 | 사용자의 사이트 접근 권한을 확인해 주세요. |
세션 만료
| 증상 | 원인 | 해결 방법 |
|---|---|---|
| 작업 중 로그인 화면 전환 | 세션 타임아웃 (기본 30분) | 다시 로그인해 주세요. 타임아웃이 짧다면 web.xml에서 조정해 주세요. |
| 다른 기기에서 로그아웃됨 | 동시 로그인 정책(KICK)으로 강제 종료 | 동시 로그인 설정을 확인해 주세요. |
| 세션 관련 에러 반복 | Redis 캐시 장애 | Redis 서비스 상태를 확인해 주세요. |