500 내부 서버 오류 - BadFormData

Apigee Edge 문서를 보고 있습니다.
Apigee X 문서로 이동하세요.
info

증상

클라이언트 애플리케이션은 API 호출의 응답으로 오류 코드 protocol.http.BadFormData와 함께 HTTP 상태 코드 500 Internal Server Error를 받습니다.

오류 메시지

클라이언트 애플리케이션은 다음 응답 코드를 받습니다.

HTTP/1.1 500 Internal Server Error

또한 다음 오류 메시지가 표시될 수 있습니다.

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

양식 데이터

이 문제의 해결 방법을 자세히 살펴보기 전에 양식 데이터가 무엇인지 알아보겠습니다.

양식 데이터는 일반적으로 텍스트 입력란, 버튼, 체크박스와 같은 요소가 있는 HTML 양식을 통해 사용자가 제공하는 정보입니다. 양식 데이터는 일반적으로 HTTP 요청 또는 응답의 일부로 키-값 쌍의 시리즈로 전송됩니다.

양식 데이터 전송

  1. Content-Type: application/x-www-form-urlencoded
    • 양식 데이터의 크기가 작은 경우 데이터는 다음과 같은 키-값 쌍으로 전송됩니다.
      • 양식 - 섹션 17.13.4.1에 설명된 규칙에 따라 인코딩된 두 키의 문자
      • 헤더 Content-Type: application/x-www-form-urlencoded

      양식 데이터가 포함된 샘플 요청:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • 키와 값의 영숫자가 아닌 문자는 백분율로 인코딩됩니다. 즉, 특정 문자의 ASCII 코드를 나타내는 2자리 16진수가 뒤에 오는 백분율 기호로 구성된 문자 3개%HH로 표현됩니다.
    • 따라서 백분율 기호 (%)가 양식 데이터에 허용되더라도 특수 이스케이프 시퀀스의 시작으로 해석됩니다. 따라서 양식 데이터의 키나 값에 퍼센트 기호 (%)가 포함되어야 하는 경우 퍼센트 기호(%) 문자의 ASCII 코드를 나타내는 %25, 로 전송해야 합니다.
  2. Content-Type: multipart/form-data

    비 ASCII 문자가 포함된 대량의 바이너리 데이터 또는 텍스트를 전송하려면 양식 - 섹션 17.13.4.2에 설명된 대로 Content-Type: multipart/form-data를 사용하여 데이터를 전송하면 됩니다.

가능한 원인

이 오류는 다음 조건이 모두 충족된 경우에만 발생합니다.

  1. 클라이언트가 Apigee Edge로 전송한 HTTP 요청에는 다음이 포함됩니다.
    1. Content-Type: application/x-www-form-urlencoded 및
    2. 퍼센트 기호 (%)가 있는 양식 데이터 또는 퍼센트 기호(%)에 이어 양식 - 섹션 17.13.4.1에 따라 허용되지 않는 잘못된 16진수 문자가 표시됩니다.
  2. Apigee Edge의 API 프록시가 ExtractVariables 또는 AssignMessage 정책을 사용하여 요청 흐름에서 사용이 허용되지 않는 문자가 포함된 특정 양식 매개변수를 읽습니다.

    예를 들어 양식 데이터에 퍼센트 기호 (%)가 그대로 (인코딩 없이) 포함되어 있거나 키 또는 값에 퍼센트 기호 (%)에 이어 잘못된 16진수 문자가 포함되어 있으면 이 오류가 발생합니다.

    이 오류의 가능한 원인은 다음과 같습니다.

    원인 설명 다음에 관한 문제 해결 안내
    요청의 양식 매개변수에 허용되지 않는 문자가 있습니다 클라이언트가 HTTP 요청의 일부로 전달한 양식 매개변수에 사용이 허용되지 않는 문자가 포함되어 있습니다. Edge Public 및 Private Cloud 사용자

일반적인 진단 단계

다음 도구/기법 중 하나를 사용하여 이 오류를 진단하세요.

API 모니터링

API 모니터링을 사용하여 오류를 진단하려면 다음 단계를 따르세요.

  1. 적절한 역할이 있는 사용자로 Apigee Edge UI에 로그인합니다.
  2. 문제를 조사하려는 조직으로 전환합니다.

  3. 분석 > API 모니터링 > 조사 페이지로 이동합니다.
  4. 오류가 발생한 구체적인 기간을 선택합니다.
  5. 시간에 대한 오류 코드를 표시합니다.

  6. 아래와 같이 오류 코드 protocol.http.BadFormData가 있는 셀을 선택합니다.

    (큰 이미지 보기)

  7. 결함 코드 protocol.http.BadFormData에 관한 정보가 아래와 같이 표시됩니다.

    (큰 이미지 보기)

  8. 로그 보기를 클릭하고 실패한 요청의 행을 펼칩니다.

  9. 로그 창에서 다음 세부정보를 확인합니다.
    • 상태 코드: 500
    • 결함 소스: proxy
    • 오류 코드: protocol.http.BadFormData
    • 결함 정책: extractvariables/EV-ExtractFormParams
  10. 오류 소스가 proxy이고 오류 코드가 protocol.http.BadFormData이며 오류 정책이 비어 있지 않으면 오류 정책에 표시된 특정 정책이 사용이 허용되지 않는 문자가 포함된 양식 데이터 (양식 매개변수)를 읽거나 추출하는 중에 오류가 발생했음을 나타냅니다.
  11. 이 예에서 X-Apigee-fault-policy는 extractvariables/EV- ExtractFormParams, 입니다. 즉, EV-ExtractFormParams라는 ExtractVariables 정책이 양식 매개변수를 읽거나 추출하는 동안 실패했습니다.

추적 도구

Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.

  1. 추적 세션을 사용 설정하고 다음 중 하나를 사용합니다.
    • 500 Internal Server Error 오류가 발생할 때까지 기다리거나
    • 문제를 재현할 수 있는 경우 API를 호출하여 문제를 재현합니다. 500 Internal Server Error
  2. 모든 FlowInfo 표시가 사용 설정되어 있는지 확인합니다.

  3. 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
  4. 트레이스의 여러 단계를 탐색하여 실패가 발생한 위치를 찾습니다.
  5. 일반적으로 아래와 같이 정책 중 하나에서 오류를 확인할 수 있습니다.

    위의 샘플 추적에서 EV-ExtractFormParams이라는 ExtractVariables 정책에서 실패가 발생했음을 알 수 있습니다.

  6. 실패한 특정 정책 후 Error라는 흐름으로 이동합니다.

  7. 트레이스에서 다음 값을 확인합니다.

    오류: Bad Form Data

    state: PROXY_REQ_FLOW

    error.class: com.apigee.rest.framework.BadRequestException

    • 오류 Bad Form Data 값은 양식 매개변수에 사용할 수 없는 문자가 포함되어 있음을 나타냅니다.
    • 상태 PROXY_REQ_FLOW, 값은 API 프록시의 요청 흐름에서 오류가 발생했음을 나타냅니다.
  8. 트레이스에서 AX (분석 데이터 기록됨) 단계로 이동하여 클릭합니다.
  9. 단계 세부정보 - 오류 헤더 섹션으로 스크롤하여 아래와 같이 X-Apigee-fault-code, X-Apigee-fault-source, X-Apigee-fault-policy 값을 확인합니다.

  10. X-Apigee-fault-code 및 X-Apigee-fault-source 값은 각각 protocol.http.BadFormData 및 policy이며 X-Apigee-fault-policy는 비어 있지 않습니다. 이는 X-Apigee-fault-policy에 표시된 특정 정책이 사용이 허용되지 않는 문자가 포함된 양식 데이터 (양식 매개변수)를 읽거나 추출하는 중에 오류가 발생했음을 나타냅니다.

    응답 헤더 값
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. 이 예에서 X-Apigee-fault-policy는 extractvariables/EV- ExtractFormParams, 입니다. 이는 EV-ExtractFormParams라는 ExtractVariables 정책이 양식 매개변수를 읽거나 추출하는 중에 실패했음을 의미합니다.

NGINX

NGINX 액세스 로그를 사용하여 오류를 진단하려면 다음 단계를 따르세요.

  1. 비공개 클라우드 사용자인 경우 NGINX 액세스 로그를 사용하여 HTTP 500 Internal Server Error에 관한 주요 정보를 확인할 수 있습니다.
  2. NGINX 액세스 로그를 확인합니다.

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. 특정 기간 동안 (문제가 과거에 발생한 경우) 오류 코드 protocol.http.BadFormData가 있는 500 오류가 있는지 또는 500로 인해 여전히 실패하는 요청이 있는지 검색합니다.
  4. protocol.http.BadFormData 값과 일치하는 X-Apigee-fault-code가 있는 500 오류가 발견되면 X-Apigee-fault-source 및 X-Apigee-fault-policy 값을 확인합니다.

    NGINX 액세스 로그의 500 오류 샘플:

    위의 NGINX 액세스 로그 샘플 항목에는 X-Apigee-fault-code 및 X-Apigee-fault-source에 다음 값이 있습니다.

    헤더 값
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. X-Apigee-fault-code, X-Apigee-fault-source 값은 각각 protocol.http.BadFormData, policy 이고 X-Apigee-fault-policy는 비어 있지 않습니다. 이는 X-Apigee-fault-policy에 표시된 특정 정책이 사용이 허용되지 않는 문자가 포함된 양식 데이터 (양식 매개변수)를 읽거나 추출하는 중에 오류가 발생했음을 나타냅니다.
  6. 이 예에서 X-Apigee-fault-policy는 extractvariables/EV- ExtractFormParams, 입니다. 즉, EV-ExtractFormParams라는 ExtractVariables 정책이 양식 매개변수를 읽는 중에 실패했습니다.

원인: 요청의 양식 매개변수에 허용되지 않는 문자가 포함되어 있음

진단

  1. 일반적인 진단 단계에 설명된 대로 API Monitoring, Trace 도구 또는 NGINX 액세스 로그를 사용하여 500 Internal Server Error의 오류 코드, 오류 소스, 오류 정책을 확인합니다.
  2. 오류 코드가 protocol.http.BadFormData이고 오류 소스의 값이 proxy 또는 policy이며 오류 정책이 비어 있지 않으면 양식 데이터 (양식 매개변수)를 읽거나 추출하는 중에 오류 정책에 지정된 정책이 실패했음을 나타냅니다.
  3. 오류 정책에 표시된 정책을 검사하고 다음 정보를 확인합니다.
    1. 소스: 정책이 요청 또는 응답에서 데이터를 읽거나 추출하는지 여부를 결정합니다.
    2. 양식 매개변수: 정책에서 읽고 있는 특정 양식 매개변수를 확인합니다.

      샘플 1

      샘플 1: ExtractVariables 정책이 양식 매개변수를 추출합니다.

            <ExtractVariables name="EV-ExtractFormParms">
               <DisplayName>EV-ExtractFormParams</DisplayName>
               <Source>request</Source>
               <FormParam name="username">
                  <Pattern ignoreCase="false">{username}</Pattern>
               </FormParam>
               <FormParam name="password">
                 <Pattern ignoreCase="false">{password}</Pattern>
               </FormParam>
               <VariablePrefix>forminfo</VariablePrefix>
             <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
            </ExtractVariables>
            

      위의 ExtractVariables 정책에서 다음 사항에 유의하세요.

      • 출처: request

        이는 <Source> 요소로 표시됩니다.

      • 양식 매개변수: username 및 password

        이는 <FormParam> 요소 내의 <Pattern> 요소로 표시됩니다.

      이는 클라이언트가 Apigee Edge에 HTTP 요청의 일부로 전달한 양식 매개변수 username 또는 password에 사용이 허용되지 않는 문자가 포함되어 있음을 나타냅니다.

      샘플 2

      샘플 2: AssignMessage 정책이 양식 매개변수를 복사합니다.

            <AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams">
              <Copy source="request">
                <FormParams>
                  <FormParam name="username"/>
                  <FormParam name="password"/>
                </FormParams>
              </Copy>
              <AssignTo createNew="true" transport="http" type="request"/>
            </AssignMessage>
            

      위의 ExtractVariables 정책에서 다음 사항에 유의하세요.

      • 소스: request

        이는 <Copy> 요소의 source 속성으로 표시됩니다.

      • 양식 매개변수: username 및 password

        이는 <FormParam> 요소의 name 속성으로 표시됩니다.

      이는 클라이언트가 Apigee Edge에 HTTP 요청의 일부로 전달한 양식 매개변수 username 또는 password 또는 둘 다에 사용이 허용되지 않는 문자가 포함되어 있음을 나타냅니다.

  4. 다음 방법 중 하나를 사용하여 3단계에서 식별된 양식 매개변수에 사용할 수 없는 문자가 있는지 확인합니다.

    추적 도구

    Trace 도구를 사용하여 검증하려면 다음 단계를 따르세요.

    1. 일반적인 진단 단계에 설명된 대로 실패한 요청의 트레이스를 캡처한 경우 실패한 요청 중 하나를 선택합니다.
    2. 사용이 허용되지 않는 문자가 포함된 양식 매개변수가 위의 3단계의 HTTP 요청에 포함되어 있다고 판단되면 다음 단계를 따르세요.
      1. 클라이언트로부터 요청 수신됨 단계로 이동합니다.
      2. 단계 세부정보 섹션까지 아래로 스크롤하여 콘텐츠 요청을 검토합니다.

        ( 큰 이미지 보기)

      3. 위 예에서 password 형식 매개변수에는 퍼센트 기호 (%)가 포함되어 있습니다.
      4. 백분율 기호 (%)는 백분율 인코딩 특수문자에도 사용되므로 양식 데이터에서 그대로 사용할 수 없습니다.
      5. 따라서 Apigee Edge는 오류 코드 protocol.http.BadFormData와 함께 500 Internal Server Error로 응답합니다.

    실제 요청

    실제 요청을 사용하여 검증하려면 다음 단계를 따르세요.

    1. 타겟 서버에 전송된 실제 요청에 액세스할 수 없는 경우 해결 방법으로 이동하세요.
    2. Apigee Edge에 전송된 실제 요청에 액세스할 수 있는 경우 다음 단계를 실행합니다.
      1. 양식 데이터 콘텐츠를 검토하여 퍼센트 기호 (%) 또는 퍼센트 기호 (%)에 이어 잘못된 16진수 문자와 같이 사용이 허용되지 않는 문자가 포함되어 있는지 확인합니다.

        샘플 1

        샘플 요청 1: 요청의 일부로 양식 데이터

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        이 예시에서 client_secret 요소에는 퍼센트 기호 (%)에 이어 잘못된 16진수 문자 ZY가 포함되어 있습니다.

        샘플 2

        샘플 요청 2: 파일에 전달된 양식 데이터:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        form_data.xml의 콘텐츠:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>

        이 예에서 password 요소에는 백분율 기호 (%)가 포함되어 있으며, 이는 양식 데이터에서 그대로 전달하면 안 됩니다.

    3. 위의 두 예에서 Apigee Edge에 대한 HTTP 요청의 일부로 전송된 양식 데이터에는 사용이 허용되지 않는 문자가 포함되어 있습니다.
    4. 따라서 Apigee Edge는 오류 코드 protocol.http.BadFormData와 함께 500 Internal Server Error로 응답합니다.

해상도

  1. 클라이언트가 HTTP 요청의 일부로 전송하는 양식 데이터 또는 매개변수의 키와 값에 있는 특수문자는 항상 양식 데이터 - application/x-www-form-urlencoded에 설명된 대로 인코딩되어야 합니다.
  2. 위에서 설명한 예시의 경우 다음과 같이 문제를 해결할 수 있습니다.

    샘플 1

    샘플 1: 요청의 일부로 전달된 양식 데이터:

    특정 문자의 ASCII 코드와 일치하는 유효한 16진수 문자를 사용합니다. 예를 들어 달러 기호 ($)를 보내려면 아래와 같이 %24을 사용합니다.

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    샘플 2

    샘플 요청 2: 파일에 전달된 양식 데이터:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    form_data.xml의 콘텐츠:

    백분율 (%) 기호에 백분율 인코딩을 사용합니다. 즉, 아래와 같이 %25 이 포함되도록 파일을 수정합니다.

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>

사양

Apigee Edge는 양식 데이터가 다음 사양에 따라 전송될 것으로 예상합니다.

사양
양식 데이터 - application/x-www-form-urlencoded

Apigee 지원팀의 지원이 여전히 필요한 경우 진단 정보를 수집해야 함으로 이동하세요.

진단 정보 수집 필요

위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Apigee Edge 지원팀에 연락합니다.

Public Cloud 사용자인 경우 다음 정보를 제공하세요.

  • 조직 이름
  • 환경 이름
  • API 프록시 이름
  • 오류 코드 protocol.http.BadFormData로 500 Internal Server Error을 재현하는 데 사용된 curl 명령어를 완료합니다.
  • API 요청의 추적 파일

프라이빗 클라우드 사용자인 경우 다음 정보를 제공하세요.

  • 실패한 요청에 대해 확인된 전체 오류 메시지
  • 환경 이름
  • API 프록시 번들
  • API 요청의 추적 파일
  • NGINX 액세스 로그

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    위치: ORG, ENV, PORT#이 실제 값으로 대체됩니다.

  • 메시지 프로세서 시스템 로그

    /opt/apigee/var/log/edge-message-processor/logs/system.log

참조