3. Phase 1: 등록, 페어링 및 키 교환 (Registration & Lifecycle)
클라이언트와 마스터 서버가 상호 통신을 위한 토큰 페어(Access/Refresh)를 교환하고 검증하는 단계다.
3.1. 페어링 URL 발급 (Master Server)
- 형식:
https://{master_host}/v1/auth/pair?token={pairing_token} - 제약 조건:
pairing_token은 발급 후 15분 이내에 사용되지 않으면 반드시 폐기되어야 한다 (MUST).
3.2. 등록 주소 검증 규약 (Address Validation)
클라이언트가 제출하는 client_address에 대한 마스터 서버의 검증 규칙:
- Allowed Schemes:
https://사용 강제 (단, 명시적인 개발 플래그 활성화 시http://허용). - Loopback Forbidden:
127.0.0.1,localhost등 루프백 및 링크 로컬 주소는 등록을 거부해야 한다 (MUST). - Private Network:
192.168.x.x등 사설 IP는 허용된다.
3.3. 등록 요청 및 상호 키 교환 (Mutual Registration)
클라이언트는 등록 시 자신이 마스터 서버를 호출할 때 쓸 토큰을 발급받음과 동시에, 마스터 서버가 자신을 호출할 때 사용할 초기 토큰 페어를 생성하여 전달해야 한다 (MUST).
Endpoint: POST /v1/auth/pair (Master Server 제공)
Request (Client → Master):
{
"pairing_token": "String (필수, 최소 32자 이상)",
"client_address": "String (필수, 향후 마스터가 호출할 URI)",
"device_name": "String (필수, 최대 100자)",
"client_credentials": {
"access_token": "String (필수, 마스터가 클라이언트를 호출할 때 사용할 토큰)",
"refresh_token": "String (필수, 클라이언트용 갱신 토큰)",
"expires_in": "Number (필수, 초 단위)"
}
}
Response (Master → Client) (200 OK):
{
"access_token": "String (필수, 클라이언트가 마스터를 호출할 때 사용할 Bearer 토큰)",
"refresh_token": "String (필수, 마스터용 장기 갱신 토큰)",
"expires_in": "Number (필수)",
"server_credentials": "Object (필수, 서버 서명 및 자격 증명용 JWK 공개키)"
}
3.4. 토큰 갱신 엔드포인트 대칭 구현 (Token Refresh)
양측은 타 API 호출 시 401 Unauthorized를 받으면, 발급 주체의 갱신 엔드포인트를 호출하여 토큰을 갱신하고 원래 요청을 재시도해야 한다 (MUST).
3.4.1. 클라이언트의 마스터 토큰 갱신 (Client → Master)
- Endpoint:
POST /v1/auth/refresh(Master Server 제공) - Request:
{"refresh_token": "String (필수)"} - Response: §3.3의 Master → Client 응답 포맷과 동일.
3.4.2. 마스터의 클라이언트 토큰 갱신 (Master → Client)
- Endpoint:
POST /v1/auth/refresh(Local Client 제공) - Request:
{"refresh_token": "String (필수)"} - Response:
{
"access_token": "String (필수)",
"refresh_token": "String (필수)",
"expires_in": "Number (필수)"
}
3.4.3. 토큰 갱신 상세 규칙
Refresh Token Rotation: 토큰 갱신 응답에는 항상 새로운 refresh_token이 포함되어야 한다 (MUST). 갱신에 사용된 기존 refresh_token은 즉시 무효화해야 한다 (MUST). 이를 통해 탈취된 토큰의 재사용을 방지한다.
Replay 감지: 이미 사용(무효화)된 refresh_token으로 갱신이 시도되면, 토큰 발급 주체는 해당 클라이언트(또는 사용자)에게 발급된 모든 토큰(access + refresh)을 즉시 무효화해야 한다 (MUST). 이는 토큰 탈취 후 공격자와 정당한 사용자가 경쟁적으로 갱신하는 시나리오를 차단한다. 무효화 후 401 Unauthorized를 반환한다.
갱신 실패 복구: refresh_token 자체가 만료되었거나 무효화되어 갱신이 불가능한 경우(401 Unauthorized 수신), 클라이언트는 재페어링(§3.3) 절차를 개시해야 한다 (MUST).
3.4.4. Edge → Master 토큰 관리
엣지 노드(§9)가 마스터 서버에 접속할 때 사용하는 사용자 토큰의 갱신 및 폐기 절차이다.
토큰 갱신 — Endpoint: POST /v1/edge/auth/refresh (Master Server 제공)
Request: {"refresh_token": "String (필수)"}
Response (200 OK):
{
"access_token": "String (필수)",
"refresh_token": "String (필수, 새로 발급된 토큰)",
"expires_in": "Number (필수, 초 단위)"
}
§3.4.3의 Refresh Token Rotation 및 Replay 감지 규칙이 동일하게 적용된다 (MUST).
토큰 폐기 (로그아웃) — Endpoint: POST /v1/edge/auth/revoke (Master Server 제공)
Request: {"refresh_token": "String (필수)"}
Response: 204 No Content
마스터는 해당 refresh_token과 연관된 모든 access_token을 즉시 무효화해야 한다 (MUST). 폐기 후 해당 토큰으로의 모든 API 호출은 401 Unauthorized를 반환한다.
3.5. 등록 해제 (Unregister)
클라이언트가 자발적으로 네트워크에서 이탈할 때 잔여 리소스를 정리한다.
- Endpoint:
DELETE /v1/nodes/self(Master Server 제공) - Headers:
Authorization: Bearer {client_access_token} - 제약 조건: 마스터 서버는 해당 클라이언트와 연결된 모든 WSS 세션을 즉시 강제 종료하고 상태를 정리해야 한다 (MUST). 관련된 모든 토큰은 즉시 무효화된다.
- Response:
204 No Content