수천 건의 사용자 API 요청 및 무효화

올해 4월부터 대시보드의 보안 보고서에서 매일 수천 건의 사용자 API 요청이 발생하고 있는 것을 방금 확인했습니다.

이는 제 예상치와 100배에서 1000배 정도 차이가 나는 매우 이상한 상황입니다.

키를 요청하는 상위 사용자와 각 사용자가 얼마나 많은 API 요청을 하고 있는지, 그리고 어떤 API 요청을 하고 있는지에 대한 더 자세한 보고서를 어떻게 받을 수 있을까요? 키에 읽기/쓰기 요청 권한이 있다면 누군가가 원격으로 토픽/게시글을 읽고 쓸 수 있다고 추정됩니다. 원격 사이트에서 게시글을 스크래핑하고 있는 것일까요?

또한 모든 사용자 API 키를 전역적으로 무효화하거나 만료시키는 방법이 있을까요?

확인차 말씀드리면, 질문하신 내용은 사용자 API 요청(User API requests)에 관한 것이 맞고, Discourse 사이트의 관리자 / API 페이지에서 사용자를 위해 생성한 API 키로 실행된 API 요청은 아닙니다. 아래 스크린샷에서 사용자 API 요청은 초록색으로 강조되어 있습니다:

사용자 API 키의 용도에 대한 자세한 내용은 이곳에서 확인하실 수 있습니다: User API keys specification.

Discourse 사이트와 통합되는 앱을 생성하지 않으셨다면, 가장 그럴듯한 설명은 사용자들이 DiscourseHub 앱(https://play.google.com/store/apps/details?id=com.discourse&hl=en&gl=US&pli=1)을 통해 사이트에 로그인하고 있거나, Fig - Native Discourse client for iOS 와 유사한 앱을 사용하여 사이트와 상호작용하고 있다는 것입니다.

이 답변이 모든 질문에 답하지는 못하지만, 다음 Data Explorer 쿼리를 사용하여 사용자 API 키 사용 현황에 대한 일반적인 개요를 얻을 수 있습니다:

SELECT * FROM user_api_keys

사이트에 사용자 API 키 요청을 보내는 애플리케이션 목록과 각 애플리케이션으로 요청을 보내는 사용자 수를 확인하려면:

SELECT
application_name,
COUNT(application_name) AS user_count
FROM user_api_keys
GROUP BY application_name

DiscourseHub 앱에서 연결하는 데 사용되는 사용자 API 키의 경우 application_name 값이 "Discourse - unknown"으로 설정됩니다.

사용자가 사용자 API 키를 사용하여 사이트와 상호작용하면, 해당 사용자의 설정 페이지 보안 탭에 Apps 항목이 추가됩니다:

해당 항목에는 앱에 부여된 권한(scopes)이 표시됩니다. 또한 앱의 액세스 권한을 취소할 수도 있습니다.

Discourse UI에서 모든 사용자 API 키를 만료시키거나 취소하는 방법을 찾지 못했습니다. 사용자 설정 페이지에서 한 번에 하나의 키만 취소할 수 있는 옵션만 존재합니다. Rails 콘솔을 통해 모든 사용자 API 키를 취소하는 것은 가능하지만, 먼저 키가 어떻게 사용되고 있는지 조사하는 것이 가치가 있을 것입니다.

고마워요, 네, 사용자 API 요청이 맞아요

DiscourseHub 앱에서 발생하는 요청이 너무 많은 것 같습니다. 사이트에 Data Explorer가 설치되어 있다면, 다음 쿼리의 결과를 확인해 보고 싶습니다:

SELECT
application_name,
COUNT(application_name) AS user_count
FROM user_api_keys
GROUP BY application_name

저는 제 테스트 사이트에서 해당 쿼리를 테스트해 보았지만, DiscourseHub 앱에서 발생한 user_api_request는 단 하나뿐이었습니다. 여러 사용자가 여러 앱을 통해 Discourse에 연결하는 상황을 처리하기 위해 쿼리를 올바르게 구성했다고 _생각_하지만, 결과에 이상한 부분이 있다면 알려 주세요.

데이터 탐색기를 설치하는 데 시간이 좀 걸렸고, 재구성이 어떤 이유에서인지 실패했습니다.

다음과 같은 내용을 확인했습니다:

application_name user_count
Discourse - xhanse's iPhone X 1
Discourse - iPhone 1
Discourse - xrett's iPhone 2
Discourse - xave's iPhone 1
Discourse - xixu's iPhone 1
Discourse - xevin's GS8 1

일부 이름을 마스킹 처리했는데, 사용자 수가 매우 적은 것으로 보입니다. 이 쿼리는 특정 기간의 정보를 반환하는 것일까요? 몇몇 사용자에 대해 수천 건의 API 요청이 발생한다는 것은 과하게 느껴집니다. 또한 한 사용자의 user_count가 2로 표시되는 것은 (해당 사용자가) 2개의 API 키(즉, 2개의 앱)를 가지고 있다는 의미인가요?

이 부분은 두 가지 가능성이 있습니다. 사용자가 동일한 기기 이름을 가진 두 대의 아이폰을 사용 중이거나, 과거에 앱을 삭제했다가 다시 설치한 경우입니다. 두 경우 모두 여러 개의 API 키를 가지게 됩니다.

아니요, 활성 상태인 모든 사용자 API 키에 대한 세부 정보를 반환합니다.

아래 쿼리를 실행해 보세요:

SELECT * FROM user_api_keys

7개의 행만 반환될 것이라고 추측합니다. 그렇지 않다면 알려 주세요.

반드시 그런 것은 아닙니다. 사용자가 DiscourseHub 앱을 통해 사이트에 액세스할 때, 해당 요청은 사용자 API 요청으로 집계됩니다. 일부 사용자가 사이트를 활발히 읽는 경우, 하루에 2,000개의 요청을 생성할 수 있습니다.

네, 맞습니다. 7개 항목만 확인됩니다.

이것은 모든 것이 정상이라는 뜻인가요? 여기서는 맥락을 잘 모르겠는데, 이는 포럼이 처리할 수 있는 일반적인 부하 수준인가요?

내 생각에는 모두 합리적입니다. 맥락을 설명하자면, 오늘 DiscourseHub 앱을 통해 테스트 사이트에 잠시 로그인했습니다. 해당 사이트에는 콘텐츠가 거의 없습니다. 몇 분간 둘러보면서 36개의 사용자 API 요청을 발생시켰습니다. 스크롤할 콘텐츠가 많은 사이트라면, 한 사용자가 하루 동안 상당수의 요청을 생성하는 것은 비합리적이지 않을 수 있습니다.

여전히 이 부분에 대해 우려가 있다면, Data Explorer 플러그인을 사용하여 이 요청에서 반환된 user_id를 가진 사용자들의 활동 내역을 살펴볼 수 있습니다:

SELECT * FROM user_api_keys

기분 탓이 아니라 진짜 호기심이 이겼는지, 거의 DiscourseHub 앱으로만 사용하는 사이트를 확인해 보았습니다. 지난 24시간 동안 해당 사이트에서 사용자 API 키 요청이 거의 1,100건 발생했는데, 활성 키를 가진 사용자는 저뿐입니다. :slight_smile: