Skip to content

0.1.0 인증 마이그레이션

English | 한국어 | 日本語

ActivityPlug 0.1.0은 공개 API 세션 식별자를 HTTP Authorization 헤더로만 받습니다. 브라우저 애플리케이션은 세션 식별자 대신 /v1/browser/** 경계와 불투명 쿠키를 사용합니다.

필수 변경 사항

클라이언트 또는 proxy를 업그레이드하기 전에 다음을 완료하십시오.

  • HTTP, GraphQL, WebSocket 요청의 ActivityPlug 세션 식별자를 Authorization: Bearer <session-id>로 옮기십시오.
  • URL query parameter, GraphQL argument, GraphQL input object, JSON body, multipart field에서 sessionId를 제거하십시오.
  • 식별자를 WebSocket URL에 넣는 대신 WebSocket upgrade에서도 헤더를 사용하십시오.
  • 브라우저 코드가 ActivityPlug 세션 식별자를 JavaScript에 노출하지 않도록 하고, 요청을 /v1/browser/**로 옮기십시오.
  • GET /v1/browser/session에서 브라우저 쿠키와 CSRF 토큰을 받으십시오.
  • 브라우저 mutation 및 인증 요청에 구성된 CSRF 헤더를 보내십시오.
  • access log, analytics, 오류 보고서, 저장된 URL에 세션 식별자가 더 이상 포함되지 않는지 확인하십시오.

query 또는 body 자격 증명을 위한 호환 alias는 없습니다. 해당 입력이 포함된 요청은 무시가 아니라 거부됩니다.

공개 HTTP 요청

0.1.0 이전:

http
GET /api/v1/timelines/home?sessionId=$ACTIVITYPLUG_SESSION HTTP/1.1
Host: proxy.example

0.1.0:

http
GET /api/v1/timelines/home HTTP/1.1
Host: proxy.example
Authorization: Bearer $ACTIVITYPLUG_SESSION

모든 HTTP JSON 및 multipart request body에서 최상위 sessionId field를 제거했습니다. 해당 field가 포함된 body는 거부됩니다.

Graphql과 WebSocket 요청

GraphQL HTTP 요청은 같은 Bearer 헤더를 사용하며, argument와 input object에서 sessionId를 생략합니다. WebSocket upgrade도 Bearer 헤더를 사용하며, WebSocket URL의 자격 증명은 거부됩니다.

인증된 query, mutation, notificationStream, timelineStream에서 sessionId argument를 제거했습니다. post, media, poll, profile, search, filter, list, mute, reaction에 사용하는 GraphQL input object에서도 제거했습니다. 제거된 field의 로컬 복사본을 유지하지 말고, 0.1.0 schema를 기준으로 typed client를 다시 생성하십시오.

브라우저 애플리케이션

브라우저 애플리케이션은 /v1/browser/**를 사용해야 합니다. ActivityPlug 세션 식별자를 읽거나 저장해서는 안 됩니다.

GET /v1/browser/session으로 시작합니다. ActivityPlug는 응답에서 CSRF 토큰을 반환하고, Secure, HttpOnly __Host-activityplug 쿠키를 설정합니다. /v1/browser/auth/**를 통해 인증을 시작하고 완료한 다음 /v1/browser/api/**를 사용합니다. 브라우저 경로는 Authorization 자격 증명과 sessionId query parameter를 모두 거부합니다.

서버 및 저장소 점검표

  • 공개 토큰 가져오기가 필요할 때만 활성화하고 tokenImport.guard로 보호하십시오.
  • 배포 topology에 맞는 AuthSessionStore를 선택하십시오.
  • 브라우저 경계를 활성화할 때 브라우저 세션, OAuth state, 챌린지, 스트림 티켓, rate limit 저장소를 구성하십시오.
  • createActivityPlugServer()를 호출하기 전에 PostgreSQL 수명주기 테이블을 초기화하십시오.
  • 여러 프로세스가 같은 세션을 처리한다면 공유 PostgreSQL 또는 Redis 저장소를 사용하십시오.
  • server.ready를 기다리고, backing database client를 닫기 전에 server.close()를 호출하십시오.

검증

인증된 HTTP 또는 GraphQL 요청 하나 이상, 거부되는 query 자격 증명 요청 하나, 애플리케이션이 사용하는 WebSocket upgrade 경로를 검증하십시오. 브라우저 배포에서는 세션 발급, CSRF 거부, 인증 완료, logout, 이미 소비된 OAuth 콜백의 replay 거부도 검증해야 합니다.

관련 문서

Apache-2.0 OR MIT 라이선스로 배포됩니다.