제 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 접근 제어 설정 등)
activeSession이 활성 상태, Fay가 인가 범위 내의 작업을 실행할 수 있음
handover_pendingSession이 제어권 인계에 참여 중(제 6 장 참조), 결과 미확정
terminatingSession이 종료 중, 리소스 회수 중, 새 요청은 거부됨
terminatedSession이 완전히 종료, session_id가 이력 기록에 입력

5.1.2 상태 전이도

              ┌─────────────┐
              │   (start)   │
              └──────┬──────┘
                     │ 인가 검증 통과
                     ▼
              ┌─────────────┐
              │  creating   │
              └──────┬──────┘
                     │ 리소스 초기화 완료
                     ▼
              ┌─────────────┐  인계 발동      ┌──────────────────┐
              │   active    │────────────────→│ handover_pending │
              └──────┬──────┘                 └──────┬───────────┘
                     │  ↑                            │
              종료 조건│  │인계 타임아웃 롤백        │인계 완료
                     ▼  │                            ▼
              ┌─────────────┐                  ┌─────────────┐
              │ terminating │←─────────────────┤ (handed off)│
              └──────┬──────┘                  └─────────────┘
                     │ 리소스 회수 완료
                     ▼
              ┌─────────────┐
              │ terminated  │
              └─────────────┘

5.1.3 상태 전이 규칙

단말은 MUST 아래 표에서 허용된 전이만으로 Session 상태를 갱신한다:

현재 상태목표 상태발동 조건
creatingactive리소스 초기화 완료
creatingterminating초기화 실패(리소스가 다른 Session에 점유됨 등)
activehandover_pending해당 Session에 대한 인계 요청 수신
activeterminating능동 해제, 하트비트 타임아웃, 폐기 종료, 리소스 사용 불가
handover_pendingterminating인계 성공(원래 Session은 MUST 종료) 또는 인계 타임아웃 취소
handover_pendingactive인계가 새 제어자에 의해 거부됨(원래 상태로 롤백)
terminatingterminated리소스 완전 해제, 상태 영속화 완료

구현은 MUST NOT 열거되지 않은 상태 전이를 수행한다.

5.1.4 상태 전이의 원자성

각 상태 전이는 MUST 다음 원자성 요구사항을 충족한다:

  1. 상태의 읽기, 판정, 쓰기는 MUST 임계 영역 내에서 완료되며, 외부 관찰자는 중간 상태를 보지 않는다
  2. 상태 전이와 대응하는 리소스 작업(OS 접근 제어 하달 등)은 MUST 하나의 트랜잭션으로 실행되며, 모두 성공하거나 모두 롤백된다

5.2 Session 생성

5.2.1 생성 발동

Session은 다음 시나리오에서 생성된다:

  1. iFay_Runtime이 AuthRequest를 발신하고 인가 검증 통과(§3.3, §4.3 참조)
  2. 제어권 인계 성공 후, 새 제어자를 위해 새 Session 생성(제 6 장 참조)

5.2.2 생성 단계

단말은 MUST 다음 단계로 Session을 생성한다:

  1. 리소스 점유 사전 확인: 대상 resource_idaccess_mode에서 점유 가능한지 확인(§5.3 및 제 7 장 읽기-쓰기 잠금 규칙 참조)
  2. Session_ID 생성: 새 UUID v7 할당
  3. 초기 상태 설정: state = "creating"
  4. Session 객체 구축: §2.5에서 정의된 필드를 채움
  5. OS 접근 제어 하달: §1.3.2 인터페이스를 통해, 해당 Fay 프로세스가 지정된 모드로 리소스에 접근하는 것을 운영체제에 알림
  6. 상태 전환: state: creating → active, created_atlast_heartbeat_at 기록
  7. AuthResult 반환: session_id를 AuthResult를 통해 iFay_Runtime에 회신

5.2.3 생성 실패 처리

임의 단계 실패 시:

  1. 이미 할당된 리소스(OS 접근 제어 항목 등)는 MUST 롤백된다
  2. Session 상태는 terminating으로 전환된 후 즉시 terminated
  3. 대응하는 에러 코드(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 개 readread생성 허용
≥1 개 readwrite/execute/configure거부(E_RESOURCE_BUSY)
1 개 write/execute/configure임의 모드거부(E_RESOURCE_BUSY)

5.3.3 리소스 사용 불가의 연쇄 종료

Resource_ID에 대응하는 리소스가 사용 불가가 되는 경우(하드웨어 분리, 소프트웨어 프로세스 크래시, 운영체제가 리소스 소실 보고 등):

  1. 단말은 MUST 해당 리소스에 바인딩된 모든 Session을 즉시 terminating으로 전환
  2. 단말은 MUST 영향을 받은 모든 iFay_Runtime에 SessionStateChanged 알림을 푸시, reason"resource_unavailable"
  3. 리소스 복구 후, 종료된 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:

  1. Heartbeat 수신 후 즉시 HeartbeatAck를 반환(sequence_number는 요청과 일치)
  2. 해당 Session의 last_heartbeat_at을 갱신
  3. sequence_number가 기록된 최대값보다 작은 Heartbeat를 거부(리플레이 방지)

5.4.3 이중 판정

단말은 MUST 다음 두 조건을 동시에 충족하는 경우에만 Session 실효를 판정한다:

  1. 지속 연결 단절이 하트비트 타임아웃 임계값을 초과
  2. last_heartbeat_at로부터의 경과 시간이 하트비트 타임아웃 임계값을 초과

이 이중 판정의 설계 의도:

  • 지속 연결의 단기 변동 기간 중 애플리케이션 계층 하트비트는 여전히 정상일 수 있음(실효로 오판해서는 안 됨)
  • 애플리케이션 계층 하트비트 정지하지만 지속 연결이 여전히 존재(Fay 정체 등)하는 경우 하트비트 타임아웃으로 감지 필요
  • 둘이 동시에 발생해야 비로소 고신뢰도의 실효 신호

5.4.4 실효 후의 처리

실효 판정 후, 단말은 MUST:

  1. Session 상태 전환: active → terminating
  2. 점유한 Terminal_Resource 해제
  3. OS 인터페이스를 통해 해당 Fay의 리소스 접근 권한 취소
  4. 지속 연결 복구 또는 하트비트 복구 대기 기간 중, 해당 Session에 대한 모든 요청은 E_SESSION_TERMINATED 반환
  5. 단말은 MAY 지속 연결 복구 후 iFay_Runtime에 한 번 SessionStateChanged 알림을 푸시할 수 있지만, 이 시점에 Session은 이미 복구 불가

5.4.5 하트비트의 옵션 모드

구현은 MAY 다음 하트비트 최적화 모드를 지원한다(명시적 지원 선언 필요):

  1. 집계 하트비트: iFay_Runtime이 하나의 Heartbeat 메시지에서 여러 Session을 동시 보고(하나의 runtime이 대량의 Session을 관리하는 시나리오에 적용)
  2. 저빈도 하트비트: 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 다음 단계로 종료를 실행한다:

  1. 상태 전환: {active|handover_pending} → terminating
  2. OS 리소스 회수: §1.3.2 인터페이스를 통해 Fay 프로세스의 리소스 접근 권한 취소
  3. 동시성 제어 해제: (resource_id, access_mode)를 점유 목록에서 삭제(제 7 장 읽기-쓰기 잠금 갱신 참조)
  4. iFay_Runtime 알림: SessionStateChanged 메시지 전송, 상태 terminated, reason 첨부
  5. 상태 전환: terminating → terminated
  6. 영속화: MAY Session 이력 기록을 감사 로그에 기록

5.5.3 종료의 멱등성

iFay_Runtime이 발신하는 SessionRelease 메시지는 MUST 멱등적이다:

  • Session이 이미 terminating 또는 terminated 상태이면, 재해제는 MUST 성공을 반환(에러로 간주하지 않음)
  • Session이 존재하지 않는 경우(이미 회수됨), E_SESSION_NOT_FOUND 반환

5.5.4 종료의 가관측성

단말은 MUST 최소 다음에 Session 종료를 알린다:

  1. 해당 Session에 관련된 iFay_Runtime(SessionStateChanged 경유)
  2. 단말 로컬의 리소스 관리 서브시스템(가용성 상태 갱신용)

단말은 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를 전송한다:

  1. creating → active: Session 생성 성공(AuthResult를 통해 직접 알릴 수도 있음, 둘 중 하나 선택)
  2. active → handover_pending: Session이 인계 흐름에 진입
  3. handover_pending → active: 인계 취소 또는 거부
  4. * → terminatingterminating → 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 수량 제한을 구현한다:

차원기본 제한비고
단일 단말 총 활성 Session1024단말 정책으로 조정 가능
단일 Fay 활성 Session64단일 Fay에 의한 시스템 리소스 점유 방지
단일 Resource_ID 활성 read Session32read 공유 남용 방지

제한 초과 시, 단말은 MUST E_SESSION_LIMIT_EXCEEDED를 반환한다.