GraphQL API 스팸 방지 및 CAPTCHA 지원

만약 모델을 GraphQL API를 통해 수정할 수 있다면, 스팸 가능성 또는 스팸 관련 속성을 수정할 수 있는 모든 관련된 GraphQL 뮤테이션에도 지원을 추가해야 합니다. 이는 확실히 CreateUpdate 뮤테이션을 포함하지만, 모델의 기밀/공개 플래그를 변경하는 것과 관련된 다른 뮤테이션을 포함할 수도 있습니다.

GraphQL 뮤테이션에 지원 추가하기

주요 단계는 다음과 같습니다:

  1. 당신의 뮤테이션에 include Mutations::SpamProtection을 사용합니다.
  2. Update 서비스 클래스 생성자에 perform_spam_check: true를 전달합니다. Create 서비스에서는 기본적으로 true로 설정됩니다.
  3. Spammable 모델 인스턴스를 생성하거나 업데이트한 후, #check_spam_action_response!를 호출하고 모델 인스턴스를 전달합니다. 이 호출은 다음을 수행합니다:
    1. 모델에 필요한 스팸 체크를 수행합니다.
    2. 만약 스팸이 감지되면:
      • GraphQL::ExecutionError 예외를 발생시킵니다.
      • extensions: 매개변수를 통해 응답에 오류 필드가 추가됩니다. 이에 대한 자세한 내용은 스팸으로 감지된 뮤테이션 해결으로 이동하여 GraphQL API 문서의 해당 섹션을 참조하세요.

    참고: 만약 위에서 설명한 표준 ApolloLink 또는 Axios 인터셉터 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!`에 의해 예외가 발생했을 것이므로, 정상적인 resolve 반환 논리가 아래에 이어서 따를 것입니다.
      end
    end
  end
end

CAPTCHA 동작을 테스트하는 방법에 대한 지침은 탐색적 테스팅 섹션을 참조하세요.