제 5 장: 세션 관리와 생존 감지
본 장은 Session의 상태 머신, 라이프사이클 이벤트, Terminal_Resource와의 바인딩 규칙, 그리고 Liveness_Detection(생존 감지) 메커니즘을 정의한다. 본 장은 블루프린트 §2.3의 설계 의도에 대응한다.
5.1 Session 상태 머신
각 Session은 그 라이프사이클 내에서 유한 상태 머신의 여러 상태를 거친다.
5.1.1 상태 정의
SessionState = enum[
"creating",
"active",
"handover_pending",
"terminating",
"terminated"
]
| 상태 | 설명 |
|---|---|
creating | 인가 검증 통과, Session이 초기화 중(리소스 할당, OS 접근 제어 설정 등) |
active | Session이 활성 상태, Fay가 인가 범위 내의 작업을 실행할 수 있음 |
handover_pending | Session이 제어권 인계에 참여 중(제 6 장 참조), 결과 미확정 |
terminating | Session이 종료 중, 리소스 회수 중, 새 요청은 거부됨 |
terminated | Session이 완전히 종료, session_id가 이력 기록에 입력 |
5.1.2 상태 전이도
┌─────────────┐
│ (start) │
└──────┬──────┘
│ 인가 검증 통과
▼
┌─────────────┐
│ creating │
└──────┬──────┘
│ 리소스 초기화 완료
▼
┌─────────────┐ 인계 발동 ┌──────────────────┐
│ active │────────────────→│ handover_pending │
└──────┬──────┘ └──────┬───────────┘
│ ↑ │
종료 조건│ │인계 타임아웃 롤백 │인계 완료
▼ │ ▼
┌─────────────┐ ┌─────────────┐
│ terminating │←─────────────────┤ (handed off)│
└──────┬──────┘ └─────────────┘
│ 리소스 회수 완료
▼
┌─────────────┐
│ terminated │
└─────────────┘
5.1.3 상태 전이 규칙
단말은 MUST 아래 표에서 허용된 전이만으로 Session 상태를 갱신한다:
| 현재 상태 | 목표 상태 | 발동 조건 |
|---|---|---|
creating | active | 리소스 초기화 완료 |
creating | terminating | 초기화 실패(리소스가 다른 Session에 점유됨 등) |
active | handover_pending | 해당 Session에 대한 인계 요청 수신 |
active | terminating | 능동 해제, 하트비트 타임아웃, 폐기 종료, 리소스 사용 불가 |
handover_pending | terminating | 인계 성공(원래 Session은 MUST 종료) 또는 인계 타임아웃 취소 |
handover_pending | active | 인계가 새 제어자에 의해 거부됨(원래 상태로 롤백) |
terminating | terminated | 리소스 완전 해제, 상태 영속화 완료 |
구현은 MUST NOT 열거되지 않은 상태 전이를 수행한다.
5.1.4 상태 전이의 원자성
각 상태 전이는 MUST 다음 원자성 요구사항을 충족한다:
- 상태의 읽기, 판정, 쓰기는 MUST 임계 영역 내에서 완료되며, 외부 관찰자는 중간 상태를 보지 않는다
- 상태 전이와 대응하는 리소스 작업(OS 접근 제어 하달 등)은 MUST 하나의 트랜잭션으로 실행되며, 모두 성공하거나 모두 롤백된다
5.2 Session 생성
5.2.1 생성 발동
Session은 다음 시나리오에서 생성된다:
- iFay_Runtime이 AuthRequest를 발신하고 인가 검증 통과(§3.3, §4.3 참조)
- 제어권 인계 성공 후, 새 제어자를 위해 새 Session 생성(제 6 장 참조)
5.2.2 생성 단계
단말은 MUST 다음 단계로 Session을 생성한다:
- 리소스 점유 사전 확인: 대상
resource_id가access_mode에서 점유 가능한지 확인(§5.3 및 제 7 장 읽기-쓰기 잠금 규칙 참조) - Session_ID 생성: 새 UUID v7 할당
- 초기 상태 설정:
state = "creating" - Session 객체 구축: §2.5에서 정의된 필드를 채움
- OS 접근 제어 하달: §1.3.2 인터페이스를 통해, 해당 Fay 프로세스가 지정된 모드로 리소스에 접근하는 것을 운영체제에 알림
- 상태 전환:
state: creating → active,created_at과last_heartbeat_at기록 - AuthResult 반환:
session_id를 AuthResult를 통해 iFay_Runtime에 회신
5.2.3 생성 실패 처리
임의 단계 실패 시:
- 이미 할당된 리소스(OS 접근 제어 항목 등)는 MUST 롤백된다
- Session 상태는
terminating으로 전환된 후 즉시terminated로 - 대응하는 에러 코드(
E_RESOURCE_BUSY,E_OS_INTEGRATION_FAILED등)를 반환
5.3 Session과 Terminal_Resource의 바인딩
5.3.1 일대일 바인딩
각 활성 Session은 MUST 정확히 하나의 Resource_ID에 바인딩된다. 단말은 (resource_id, access_mode)를 통해 리소스의 점유 관계를 유지한다.
5.3.2 배타성과 공유성 규칙
상세는 제 7 장 §7.2 읽기-쓰기 잠금 매트릭스 참조. 본 절은 세션 레벨의 단순화된 규칙을 제시한다:
| 리소스 현재 활성 Session | 새 Session 요청 | 처리 |
|---|---|---|
| 없음 | 임의 모드 | 생성 허용 |
| ≥1 개 read | read | 생성 허용 |
| ≥1 개 read | write/execute/configure | 거부(E_RESOURCE_BUSY) |
| 1 개 write/execute/configure | 임의 모드 | 거부(E_RESOURCE_BUSY) |
5.3.3 리소스 사용 불가의 연쇄 종료
Resource_ID에 대응하는 리소스가 사용 불가가 되는 경우(하드웨어 분리, 소프트웨어 프로세스 크래시, 운영체제가 리소스 소실 보고 등):
- 단말은 MUST 해당 리소스에 바인딩된 모든 Session을 즉시
terminating으로 전환 - 단말은 MUST 영향을 받은 모든 iFay_Runtime에
SessionStateChanged알림을 푸시,reason은"resource_unavailable" - 리소스 복구 후, 종료된 Session은 MUST NOT 자동 복구; iFay_Runtime은 AuthRequest를 재발신하여 새 Session을 생성해야 함
5.4 Liveness_Detection(생존 감지)
생존 감지는 지속 연결 유지와 애플리케이션 계층 하트비트 두 개의 독립 신호로 Session이 여전히 활성인지 판정한다.
5.4.1 지속 연결 유지
iFay_Runtime과 단말 간에는 MUST 하나의 지속 연결 채널(WebSocket, HTTP/2 stream, gRPC stream 등)을 유지한다.
단말은 MUST 해당 지속 연결의 상태를 모니터링한다:
- 연결 확립: 지속 연결 신호 유효
- 연결 단절: 지속 연결 신호 무효(TCP RST, 타임아웃 무응답 등 포함)
지속 연결 단절은 MAY 일시적 네트워크 변동의 결과일 가능성이 있으므로, MUST NOT 단독으로 Session 종료의 근거로 삼지 않는다(§5.4.3 이중 판정 참조).
5.4.2 애플리케이션 계층 하트비트
iFay_Runtime은 MUST 지속 연결상에서 각 활성 Session에 대해 주기적으로 Heartbeat 메시지를 전송한다:
Heartbeat (body of ProtocolMessage) {
required session_id : Session_ID
required sequence_number : uint64
}
HeartbeatAck (body of ProtocolMessage) {
required session_id : Session_ID
required sequence_number : uint64
}
| 매개변수 | 기본값 | 범위 |
|---|---|---|
| 하트비트 간격 | 10초 | 1–60초 |
| 하트비트 타임아웃 임계값 | 30초 | 하트비트 간격 × 2에서 하트비트 간격 × 6까지 |
sequence_number는 각 Session 내에서 단조 증가하며, 0에서 시작한다.
단말은 MUST:
- Heartbeat 수신 후 즉시 HeartbeatAck를 반환(
sequence_number는 요청과 일치) - 해당 Session의
last_heartbeat_at을 갱신 sequence_number가 기록된 최대값보다 작은 Heartbeat를 거부(리플레이 방지)
5.4.3 이중 판정
단말은 MUST 다음 두 조건을 동시에 충족하는 경우에만 Session 실효를 판정한다:
- 지속 연결 단절이 하트비트 타임아웃 임계값을 초과
last_heartbeat_at로부터의 경과 시간이 하트비트 타임아웃 임계값을 초과
이 이중 판정의 설계 의도:
- 지속 연결의 단기 변동 기간 중 애플리케이션 계층 하트비트는 여전히 정상일 수 있음(실효로 오판해서는 안 됨)
- 애플리케이션 계층 하트비트 정지하지만 지속 연결이 여전히 존재(Fay 정체 등)하는 경우 하트비트 타임아웃으로 감지 필요
- 둘이 동시에 발생해야 비로소 고신뢰도의 실효 신호
5.4.4 실효 후의 처리
실효 판정 후, 단말은 MUST:
- Session 상태 전환:
active → terminating - 점유한 Terminal_Resource 해제
- OS 인터페이스를 통해 해당 Fay의 리소스 접근 권한 취소
- 지속 연결 복구 또는 하트비트 복구 대기 기간 중, 해당 Session에 대한 모든 요청은
E_SESSION_TERMINATED반환 - 단말은 MAY 지속 연결 복구 후 iFay_Runtime에 한 번
SessionStateChanged알림을 푸시할 수 있지만, 이 시점에 Session은 이미 복구 불가
5.4.5 하트비트의 옵션 모드
구현은 MAY 다음 하트비트 최적화 모드를 지원한다(명시적 지원 선언 필요):
- 집계 하트비트: iFay_Runtime이 하나의 Heartbeat 메시지에서 여러 Session을 동시 보고(하나의 runtime이 대량의 Session을 관리하는 시나리오에 적용)
- 저빈도 하트비트: Session이 장기간 리소스 접근을 발신하지 않는 경우, 하트비트 간격은 최대 60초까지 확장 가능
집계 하트비트의 구체적 형식은 옵션 확장으로서 schema.json에서 옵션 필드로 정의된다.
5.5 Session 종료
5.5.1 종료 발동 조건
| 발동 원인 | reason 필드 값 | 발동자 |
|---|---|---|
| 능동 해제 | "client_release" | iFay_Runtime |
| 하트비트 타임아웃 | "liveness_timeout" | 단말 Liveness_Detection |
| 폐기 종료 | "credential_revoked" | 단말 폐기 목록 갱신 |
| 리소스 사용 불가 | "resource_unavailable" | 단말 OS 통합 계층 |
| 자격 증명 만료 | "credential_expired" | 단말 정기 확인 |
| 인계 완료 | "handed_over" | 단말 인계 흐름 |
| 강제 종료 | "forced" | 단말 관리 인터페이스(관리자 작업 등) |
5.5.2 종료 단계
단말은 MUST 다음 단계로 종료를 실행한다:
- 상태 전환:
{active|handover_pending} → terminating - OS 리소스 회수: §1.3.2 인터페이스를 통해 Fay 프로세스의 리소스 접근 권한 취소
- 동시성 제어 해제: (resource_id, access_mode)를 점유 목록에서 삭제(제 7 장 읽기-쓰기 잠금 갱신 참조)
- iFay_Runtime 알림:
SessionStateChanged메시지 전송, 상태terminated, reason 첨부 - 상태 전환:
terminating → terminated - 영속화: MAY Session 이력 기록을 감사 로그에 기록
5.5.3 종료의 멱등성
iFay_Runtime이 발신하는 SessionRelease 메시지는 MUST 멱등적이다:
- Session이 이미
terminating또는terminated상태이면, 재해제는 MUST 성공을 반환(에러로 간주하지 않음) - Session이 존재하지 않는 경우(이미 회수됨),
E_SESSION_NOT_FOUND반환
5.5.4 종료의 가관측성
단말은 MUST 최소 다음에 Session 종료를 알린다:
- 해당 Session에 관련된 iFay_Runtime(
SessionStateChanged경유) - 단말 로컬의 리소스 관리 서브시스템(가용성 상태 갱신용)
단말은 MAY 다음 알림을 선택할 수 있다:
- 해당 리소스를 대기 중인 다른 iFay_Runtime(§6 인계 알림 메커니즘 경유)
- 감사 로그(단말 구현의 감사 정책에 따름)
5.6 상태 변경 알림
SessionStateChanged (body of ProtocolMessage) {
required session_id : Session_ID
required new_state : SessionState
optional reason : string
optional details : map<string, string>
}
단말은 MUST 다음 상태 전이 발생 시 iFay_Runtime에 SessionStateChanged를 전송한다:
creating → active: Session 생성 성공(AuthResult를 통해 직접 알릴 수도 있음, 둘 중 하나 선택)active → handover_pending: Session이 인계 흐름에 진입handover_pending → active: 인계 취소 또는 거부* → terminating와terminating → terminated: 종료 프로세스의 시작과 끝
5.7 Session과 자격 증명 라이프사이클의 관계
Session의 라이프사이클은 자격 증명 라이프사이클로부터 독립적이지만, 단말은 MUST 자격 증명 상태 변화를 모니터링한다:
| 자격 증명 이벤트 | Session 영향 |
|---|---|
자격 증명 not_after 도달 | 관련 Session은 즉시 credential_expired로 종료 |
| 자격 증명 폐기(폐기 선언이 단말에 도달) | 관련 Session은 즉시 credential_revoked로 종료 |
| 자격 증명이 동일 ID로 재발급(이론적으로 불가능, descriptor_id는 재사용 불가) | 적용 안 됨 |
| 자격 증명이 새 버전으로 덮어쓰기(갱신 흐름) | Session 영향 없음(여전히 원래 credential_ref로 검증) |
5.8 Session 수량 제한
단말은 SHOULD 리소스 고갈 방지를 위해 Session 수량 제한을 구현한다:
| 차원 | 기본 제한 | 비고 |
|---|---|---|
| 단일 단말 총 활성 Session | 1024 | 단말 정책으로 조정 가능 |
| 단일 Fay 활성 Session | 64 | 단일 Fay에 의한 시스템 리소스 점유 방지 |
| 단일 Resource_ID 활성 read Session | 32 | read 공유 남용 방지 |
제한 초과 시, 단말은 MUST E_SESSION_LIMIT_EXCEEDED를 반환한다.
