Skip to content

feat: 송출 계정 연결 조회·해제 API 추가 #88

Description

@itzjb

문제

#83 으로 송출 계정 연결은 가능해졌으나 연결된 뒤에 할 수 있는 것이 없다.

  • 클라이언트가 "이 사용자가 연결돼 있는지"를 물어볼 곳이 없다. 연결 응답을 로컬에 보관하는 수밖에 없는데, 다른 기기에서 연결하거나 사용자가 Google 계정에서 권한을 취소하면 클라이언트만 모르게 된다.
  • 연결을 해제할 방법이 없다.
  • 리프레시 토큰이 무효화돼도 클라이언트가 그 사실을 구분할 수 없다. 방송 시작이 streaming_prepare_failed(502)로 실패하는데, 이는 "잠시 후 재시도" 안내로 이어진다. 실제로는 재연결이 필요한 상황이다.

치지직 연동보다 먼저 해야 한다. 지금 구조로 플랫폼을 하나 더 얹으면 같은 공백이 두 배가 된다.

작업 범위

1. 연결 목록 조회

GET /auth/streaming/accounts
Authorization: Bearer <액세스 토큰>

→ 200 [{ "provider": "youtube",
          "channel_id": "UC...",
          "channel_title": "Team Framework",
          "connected_at": "2026-08-10T08:19:00Z" }]

플랫폼별 엔드포인트를 만들지 않는다. 치지직이 붙으면 배열에 항목이 하나 늘어날 뿐이고, 클라이언트 코드도 서버 계약도 바뀌지 않는다. /auth/youtube/... 형태로 만들면 나중에 /auth/chzzk/... 를 또 만들게 된다.

연결이 없으면 빈 배열을 반환한다(404 아님).

2. 연결 해제

DELETE /auth/streaming/accounts/{provider}
Authorization: Bearer <액세스 토큰>

→ 204

세 단계를 순서대로 수행한다. 순서가 중요하다.

  1. 플랫폼에 만들어 둔 재사용 스트림 리소스 삭제 — 우리 DB 행만 지우면 사용자 채널에 고아 리소스가 남고, 재연결 시 또 하나가 만들어져 누적된다
  2. 플랫폼 쪽 권한 취소 (YouTube는 Google revoke 엔드포인트) — 하지 않으면 사용자의 Google 계정에 "InnoLive에 권한 부여됨"이 계속 남는다. 사용자가 "연결 해제"를 눌렀을 때 기대하는 결과가 아니다
  3. DB 행 삭제

토큰을 먼저 폐기하면 1번을 수행할 수 없으므로 순서를 바꾸면 안 된다.

1·2가 실패해도 3은 수행한다. 사용자의 의도는 연결 해제이고, 외부 API 실패로 해제가 막히면 안 된다. 실패는 로그로 남긴다(이미 토큰이 무효화된 상태에서 해제하는 경우가 정상 시나리오에 포함된다).

3. 재연결 필요 상태 구분

리프레시 토큰이 무효화된 경우(사용자가 Google에서 권한 취소, 토큰 만료 등)를 일반 실패와 구분한다.

409 streaming_reconnect_required

POST /sessions/{id}/stream/start 와 위 조회 API 양쪽에서 판별 가능해야 한다. 클라이언트가 "재연결해 주세요"로 정확히 안내할 수 있게 된다.

4. 채널 정보 갱신

사용자가 채널 이름을 바꾸면 저장값이 낡는다. 조회할 때마다 플랫폼 API를 호출하면 quota를 소모하므로, 저장값을 반환하되 연결 시점과 방송 준비 시점에 갱신하는 정도로 한다.

확정된 판단

  • 해제 시 플랫폼 권한 취소를 수행한다
  • 해제 시 재사용 스트림 리소스를 정리한다
  • 조회·해제 엔드포인트는 플랫폼 중립 경로로 둔다

범위 밖

  • 치지직 연동 (별도 이슈)
  • 공개 범위 선택 UI
  • 클라이언트 구현 (innolive-client 레포는 건드리지 않는다)

관련

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions