GraphQL API 스팸 방지 및 CAPTCHA 지원
모델을 GraphQL API를 통해 수정할 수 있는 경우, 스팸 가능성이 있는 속성을 수정할 수 있는 모든 관련 GraphQL 뮤테이션에도 지원을 추가해야 합니다.
이는 Create
및 Update
뮤테이션뿐만 아니라, 모델의 기밀성/공개 플래그를 변경하는 것과 관련된 다른 뮤테이션을 포함할 수도 있습니다.
GraphQL 뮤테이션에 지원 추가
주요 단계는 다음과 같습니다.
- 뮤테이션에서
Mutations::SpamProtection
을 사용합니다. - Update 서비스 클래스 생성자에
perform_spam_check: true
를 전달합니다. 이는 Create 서비스에서 기본적으로true
로 설정됩니다. -
Spammable
모델 인스턴스를 생성하거나 업데이트한 후,#check_spam_action_response!
를 호출하고 모델 인스턴스를 전달합니다. 이 호출은 다음을 수행합니다.- 모델에 대해 필요한 스팸 확인을 수행합니다.
- 스팸이 감지되면:
-
GraphQL::ExecutionError
예외를 발생시킵니다. -
extensions:
매개변수를 통해 응답에 에러 필드로 추가된 관련 정보를 포함시킵니다. 이러한 필드에 대한 자세한 내용은 GraphQL API 문서의 스팸으로 감지된 뮤테이션 해결 섹션을 참조하십시오.
-
참고: 위에서 설명한 표준 ApolloLink 또는 Axios interceptor CAPTCHA 지원을 사용하는 경우, 해당 필드 세부 정보를 무시할 수 있습니다. 자동으로 처리되기 때문에, 잠재적인 스팸을 처리하기 위해 직접 GraphQL API를 사용하고 해결된 CAPTCHA 응답으로 요청을 다시 제출하려고 시도하는 경우에 관련성을 갖습니다.
예:
module Mutations
module Widgets
class Create < BaseMutation
include Mutations::SpamProtection
def resolve(args)
service_response = ::Widgets::CreateService.new(
project: project,
current_user: current_user,
params: args
).execute
widget = service_response.payload[:widget]
check_spam_action_response!(widget)
# 만약 가능한 스팸이 감지되었다면, `#check_spam_action_response!`에 의해 예외가 발생했을 것이므로, 일반적인 리졸브 반환 논리가 이어져야 합니다.
end
end
end
end
GraphQL API에서 CAPTCHA 동작을 테스트하는 방법에 대한 지침은 탐사 테스트 섹션을 참조하십시오.