8.0 KiB
8.0 KiB
Dashboard 관리자 인증 런타임 흐름
목적과 범위
Streamlit session 시작부터 설정 판정, 로그인 성공·실패, 인증된 page dispatch와 로그아웃까지의 실행 순서와 실패 복구 계약을 정의한다.
- 포함 범위: credential 환경변수, login form, 1초 실패 지연, session 인증, logout, 인증 event
- 제외 범위: MCP 요청, 영속 session, application lock, 외부 rate limiter 구현
- 시작 조건: Streamlit이
dashboard/app.py를 새로 실행하거나 rerun함 - 성공 종료 상태: 인증된 기존 Dashboard page가 렌더링되거나 로그아웃 후 로그인 화면이 렌더링됨
- 실패 종료 상태: 안전한 설정·credential 오류를 표시하고 DB·gateway를 호출하지 않은 미인증 상태
흐름
dashboard-entry — Session 시작과 인증 경계
- 시작 이벤트: 새 browser session 또는 Streamlit rerun
- 선행조건: Dashboard process가 시작돼 있음
- 실행 방식: 동기
- 트랜잭션·영속성 경계: 인증 상태는 현재
st.session_state에만 존재하고 SQLite transaction을 열지 않음
| 단계 ID | 실행 주체 | 시작 조건·입력 | 처리 | 읽기·쓰기 상태 | 외부 호출 | 성공 시 다음 단계 | 실패 시 전이 |
|---|---|---|---|---|---|---|---|
ENTRY-01 |
dashboard/app.py |
script 실행 | page config 후 인증 gate 호출 | 금융 상태 읽기·쓰기 없음 | 없음 | ENTRY-02 |
AUTH-FAIL-CONFIG |
ENTRY-02 |
인증 모듈 | st.session_state |
correlation ID를 조회하거나 비민감 ID 생성 | correlation ID만 session에 기록 | random token 생성 | ENTRY-03 |
AUTH-FAIL-CONFIG |
ENTRY-03 |
인증 모듈 | 두 environment key | 비어 있지 않은 문자열 두 개를 읽음 | process memory에 현재 rerun 동안만 credential 보유 | process environment | ENTRY-04 |
AUTH-FAIL-CONFIG |
ENTRY-04 |
인증 모듈 | 인증 boolean | 현재 session 인증 여부 판정 | 인증 상태 읽기 | 없음 | DASHBOARD-01 또는 LOGIN-01 |
AUTH-FAIL-CONFIG |
DASHBOARD-01 |
dashboard/app.py |
인증 true | DB 경로 취득, CSS와 nav 구성 | DB 경로 읽기 | filesystem path resolution | DASHBOARD-02 |
DASHBOARD-FAIL |
DASHBOARD-02 |
dashboard/app.py |
유효한 page query | 허용 목록으로 page를 정규화하고 dispatch | page session key, 기존 금융 읽기·쓰기 | 선택 page gateway | AUTHENTICATED |
DASHBOARD-FAIL |
dashboard-login — Login 제출
- 시작 이벤트: 미인증 사용자의 로그인 form 제출
- 선행조건: 유효한 관리자 환경 설정과 로그인 화면
- 실행 방식: 동기
- 트랜잭션·영속성 경계: 금융 DB transaction 없음; 성공 시 session boolean만 기록
| 단계 ID | 실행 주체 | 시작 조건·입력 | 처리 | 읽기·쓰기 상태 | 외부 호출 | 성공 시 다음 단계 | 실패 시 전이 |
|---|---|---|---|---|---|---|---|
LOGIN-01 |
Streamlit | 미인증, 유효 설정 | ID·password form 렌더링 | widget state | 없음 | LOGIN-02 또는 UNAUTHENTICATED |
AUTH-FAIL-CONFIG |
LOGIN-02 |
인증 모듈 | form 제출 | monotonic 시작 시각 기록, ID와 password 모두 constant-time 비교 | credential은 local variable | monotonic clock | LOGIN-03 또는 LOGIN-FAIL-01 |
LOGIN-FAIL-01 |
LOGIN-03 |
인증 모듈 | 두 비교 성공 | 인증 boolean true, 성공 event 기록, rerun | session 인증 상태 쓰기 | application log | ENTRY-01 |
AUTH-FAIL-CONFIG |
LOGIN-FAIL-01 |
인증 모듈 | 하나 이상 비교 실패 | 제출 처리 경과가 1초가 될 때까지 remaining delay | 금융 상태 무변경 | monotonic clock, sleep | LOGIN-FAIL-02 |
LOGIN-FAIL-02 |
LOGIN-FAIL-02 |
인증 모듈 | 최소 지연 완료 | 실패 event와 안전한 error flag 기록 후 rerun | credential widget state 제거 | application log | LOGIN-FAIL-03 |
UNAUTHENTICATED |
LOGIN-FAIL-03 |
인증 모듈 | 실패 rerun | ID·password를 구분하지 않는 일반 오류 표시 | 금융 상태 무변경 | 없음 | UNAUTHENTICATED |
UNAUTHENTICATED |
dashboard-logout — Logout
- 시작 이벤트: 인증된 사용자의 sidebar 로그아웃 click
- 선행조건: 현재 session 인증 boolean true
- 실행 방식: 동기
- 트랜잭션·영속성 경계: 인증 boolean만 제거하며 금융 DB를 변경하지 않음
| 단계 ID | 실행 주체 | 시작 조건·입력 | 처리 | 읽기·쓰기 상태 | 외부 호출 | 성공 시 다음 단계 | 실패 시 전이 |
|---|---|---|---|---|---|---|---|
LOGOUT-01 |
인증 모듈 | 로그아웃 click | 인증 boolean 제거와 logout event 기록 | session 인증 상태 삭제 | application log | LOGOUT-02 |
UNAUTHENTICATED |
LOGOUT-02 |
Streamlit | 인증 상태 없음 | rerun | 금융 상태 무변경 | 없음 | ENTRY-01 |
UNAUTHENTICATED |
실패와 복구
| 대상 단계 | 실패 조건 | 추가 쓰기 중단 | 재시도 계약 | 중복 방지 | 보상·수동 복구 | 최종 상태 |
|---|---|---|---|---|---|---|
ENTRY-03 |
환경변수 누락·빈 값·비문자열·read error | 예; DB·gateway 미호출 | 설정 수정 후 rerun | 기존 인증 boolean 제거 | 운영자가 두 secret을 유효하게 주입 | AUTH-FAIL-CONFIG |
LOGIN-02 |
잘못된 ID 또는 password | 예; 금융 상태 무변경 | 각 제출 독립 재시도 | lock·failure counter 없음 | 없음 | UNAUTHENTICATED |
LOGIN-FAIL-01 |
sleep interruption | 금융 쓰기 없음 | 다음 제출 가능 | error flag boolean만 사용 | 없음 | UNAUTHENTICATED |
DASHBOARD-01 |
DB 경로·기존 page 오류 | 해당 page의 기존 실패 계약 | 기존 Dashboard 계약에 따름 | 기존 gateway 계약 | 기존 운영 복구 | DASHBOARD-FAIL |
LOGOUT-01 |
중복 또는 이미 제거됨 | 금융 쓰기 없음 | 로그인 화면 유지 | key 제거는 멱등 | 없음 | UNAUTHENTICATED |
동시성과 순서
- 동시 실행 허용 여부: 서로 다른 browser session은 독립적으로 실행되며 같은 session은 Streamlit rerun 순서를 따른다.
- 잠금·직렬화 단위: 애플리케이션 인증 잠금과 실패 횟수 잠금은 없다. Session state는 browser session 단위다.
- 순서 보장: 설정 판정과 인증 gate가 DB 경로 취득·page dispatch보다 항상 먼저 실행된다. 실패 지연 완료 후 오류 rerun이 수행된다.
- 충돌 검출·처리: 새 session과 병렬 요청은 1초 지연을 우회할 수 있으므로 배포 경계에서 별도 rate limiting이 필요하다.
관찰 가능성
| 신호 종류 | 이름 | 발생 단계·조건 | 상관 식별자 | 진단 속성 | 민감정보 처리 |
|---|---|---|---|---|---|
| log | dashboard_auth configuration_error |
ENTRY-03 설정 오류 |
session correlation ID | event 이름 | 환경변수 값·오류 원인 원문 제외 |
| log | dashboard_auth login_succeeded |
LOGIN-03 |
session correlation ID | event 이름 | ID·password 제외 |
| log | dashboard_auth login_failed |
LOGIN-FAIL-02 |
session correlation ID | event 이름 | 실패 필드·제출 값 제외 |
| log | dashboard_auth logout |
LOGOUT-01 |
session correlation ID | event 이름 | 금융 데이터·credential 제외 |
검증
- 정상 흐름: test-only credential로 로그인하고 synthetic fixture의 기존 Dashboard page를 렌더링한 뒤 같은 session rerun을 검증한다.
- 실패 흐름: 설정 누락·빈 값·read error, 잘못된 ID·password, 일반 오류와 DB 미호출을 단위·AppTest로 검증한다.
- 경계 흐름: Import query parameter 우회 금지, credential session 제거, logout, 새 session 재인증과 MCP 범위 불변을 검증한다.
- 동시성 흐름: application lock·failure counter가 없음을 정적으로 확인하고 새 session 우회 및 배포 경계 rate limiting 요구를 README에서 검증한다.
- 운영 진입점과 기대 결과:
streamlit run dashboard/app.py; 유효 secret이면 로그인 form, 무효 설정이면 일반 설정 오류, 인증 성공 후에만 기존 Dashboard를 표시한다.