์ด ํ์ด์ง๋ Apigee ๋ฐ Apigee Hybrid์ ์ ์ฉ๋ฉ๋๋ค.
Apigee Edge ๋ฌธ์ ๋ณด๊ธฐ
๋์
๋ฐฐ์ด๊ณผ ๋ฌธ์์ด ๊ฐ์ ๋ค์ํ JSON ๊ตฌ์กฐ์ ์ ํ์ ์ง์ ํ ์ ์๋๋ก ํจ์ผ๋ก์จ ์ฝํ ์ธ ์์ค ๊ณต๊ฒฉ์ ๋ฐ๋ฅธ ์ํ์ ์ต์ํํฉ๋๋ค.
์ด ์ ์ฑ ์ ํ์ฅ ๊ฐ๋ฅํ ์ ์ฑ ์ด๋ฉฐ, ์ด ์ ์ฑ ์ ์ฌ์ฉํ๋ฉด Apigee ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋น์ฉ ๋๋ ์ฌ์ฉ๋ฅ ์ด ์ํฅ์ ๋ฐ์ ์ ์์ต๋๋ค. ์ ์ฑ ์ ํ ๋ฐ ์ฌ์ฉ ์ํฅ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ ์ฑ ์ ํ์ ์ฐธ์กฐํ์ธ์.
๋์์: JSONThreatProtection ์ ์ฑ ์ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ์์ค ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ API๋ฅผ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ณด๋ ค๋ฉด ์งง์ ๋์์์ ํ์ธํ์ธ์.
๋์์: Apigee ๊ต์ฐจ ํด๋ผ์ฐ๋ API ๊ด๋ฆฌ ํ๋ซํผ์ ๋ํ ์ด ์งง์ ๋์์์ ํ์ธํ์ธ์.
์์ ์ฐธ์กฐ
์์ ์ฐธ์กฐ๋ JSONThreatProtection ์ ์ฑ ์ ์์ ๋ฐ ์์ฑ์ ์ค๋ช ํฉ๋๋ค.
<JSONThreatProtection async="false" continueOnError="false" enabled="true" name="JSON-Threat-Protection-1"> <DisplayName>JSONThreatProtection 1</DisplayName> <ArrayElementCount>20</ArrayElementCount> <ContainerDepth>10</ContainerDepth> <ObjectEntryCount>15</ObjectEntryCount> <ObjectEntryNameLength>50</ObjectEntryNameLength> <Source>request</Source> <StringValueLength>500</StringValueLength> </JSONThreatProtection>
<JSONThreatProtection> ์์ฑ
<JSONThreatProtection async="false" continueOnError="false" enabled="true" name="JSON-Threat-Protection-1">
๋ค์ ํ๋ ๋ชจ๋ ์ ์ฑ ์์ ์์์ ๊ณตํต ์์ฑ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
์์ฑ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ | Presence |
---|---|---|---|
name |
์ ์ฑ
์ ๋ด๋ถ ์ด๋ฆ์
๋๋ค. ์ํ๋ ๊ฒฝ์ฐ |
ํด๋น ์ฌํญ ์์ | ํ์ |
continueOnError |
์ ์ฑ
์ด ์คํจํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐํ๋๋๋ก ํ๋ ค๋ฉด ์ ์ฑ
์ด ์คํจํด๋ ํ๋ฆ ์คํ์ด ๊ณ์๋๋๋ก ํ๋ ค๋ฉด |
false | ์ ํ์ฌํญ |
enabled |
์ ์ฑ
์ ์ํํ๋ ค๋ฉด ์ ์ฑ
์ ์ค์งํ๋ ค๋ฉด |
true | ์ ํ์ฌํญ |
async |
์ด ์์ฑ์ ์ง์์ด ์ค๋จ๋์์ต๋๋ค. |
false | ์ง์ ์ค๋จ๋จ |
<DisplayName> ์์
name
์์ฑ ์ธ์๋ ์ด ์์๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌ UI ํ๋ก์ ํธ์ง๊ธฐ์ ์ ์ฑ
์ ๋ค๋ฅธ ์์ฐ์ด ์ด๋ฆ์ผ๋ก ๋ผ๋ฒจ์ ์ง์ ํฉ๋๋ค.
<DisplayName>Policy Display Name</DisplayName>
๊ธฐ๋ณธ๊ฐ |
ํด๋น ์ฌํญ ์์ ์ด ์์๋ฅผ ์๋ตํ๋ฉด ์ ์ฑ
|
---|---|
Presence | ์ ํ์ฌํญ |
์ ํ | ๋ฌธ์์ด |
<ArrayElementCount> ์์
๋ฐฐ์ด์์ ํ์ฉ๋๋ ์ต๋ ์์ ์๋ฅผ ์ง์ ํฉ๋๋ค.
<ArrayElementCount>20</ArrayElementCount>
๊ธฐ๋ณธ๊ฐ: | ์ด ์์๋ฅผ ์ง์ ํ์ง ์๊ฑฐ๋ ์์ ์ ์๋ฅผ ์ง์ ํ๋ฉด ์์คํ ์์ ํ๋๋ฅผ ์ ์ฉํ์ง ์์ต๋๋ค. |
Presence: | ์ ํ์ฌํญ |
์ ํ: | ์ ์ |
<ContainerDepth> ์์
์ปจํ ์ด๋๊ฐ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ธ ์ต๋ ํ์ฉ ํฌํจ ๊น์ด๋ฅผ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ฒด๊ฐ ํฌํจ๋ ๋ฐฐ์ด์ ํฌํจ ๊น์ด๊ฐ 3์ ๋๋ค.
<ContainerDepth>10</ContainerDepth>
๊ธฐ๋ณธ๊ฐ: | ์ด ์์๋ฅผ ์ง์ ํ์ง ์๊ฑฐ๋ ์์ ์ ์๋ฅผ ์ง์ ํ๋ฉด ์์คํ ์์ ํ๋๋ฅผ ์ ์ฉํ์ง ์์ต๋๋ค. |
Presence: | ์ ํ์ฌํญ |
์ ํ: | ์ ์ |
<ObjectEntryCount> ์์
๊ฐ์ฒด์์ ํ์ฉ๋๋ ์ต๋ ํญ๋ชฉ ์๋ฅผ ์ง์ ํฉ๋๋ค.
<ObjectEntryCount>15</ObjectEntryCount>
๊ธฐ๋ณธ๊ฐ: | ์ด ์์๋ฅผ ์ง์ ํ์ง ์๊ฑฐ๋ ์์ ์ ์๋ฅผ ์ง์ ํ๋ฉด ์์คํ ์์ ํ๋๋ฅผ ์ ์ฉํ์ง ์์ต๋๋ค. |
Presence: | ์ ํ์ฌํญ |
์ ํ: | ์ ์ |
<ObjectEntryNameLength> ์์
๊ฐ์ฒด ๋ด์์ ์์ฑ ์ด๋ฆ์ ํ์ฉ๋๋ ์ต๋ ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ์ง์ ํฉ๋๋ค.
<ObjectEntryNameLength>50</ObjectEntryNameLength>
๊ธฐ๋ณธ๊ฐ: | ์ด ์์๋ฅผ ์ง์ ํ์ง ์๊ฑฐ๋ ์์ ์ ์๋ฅผ ์ง์ ํ๋ฉด ์์คํ ์์ ํ๋๋ฅผ ์ ์ฉํ์ง ์์ต๋๋ค. |
Presence: | ์ ํ์ฌํญ |
์ ํ: | ์ ์ |
<Source> ์์
JSON ํ์ด๋ก๋ ๊ณต๊ฒฉ์ ๋ํด ํํฐ๋งํ ๋ฉ์์ง์
๋๋ค. ํด๋ผ์ด์ธํธ ์ฑ์์ ์ธ๋ฐ์ด๋ ์์ฒญ์ ๊ฒ์ฆํด์ผ ํ๋ฏ๋ก, ์ด ์์๋ request
๋ก ์ค์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์
๋๋ค.
์ด ์์๋ message
๋ก ์ค์ ํ๋ฉด ์์ฒญ ํ๋ฆ์ ์ฐ๊ฒฐ๋ ๋ ์๋์ผ๋ก ์์ฒญ ๋ฉ์์ง๋ฅผ ํ๊ฐํ๊ณ ์๋ต ํ๋ฆ์ ์ฐ๊ฒฐ๋ ๋ ์๋ต ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ํ๊ฐํฉ๋๋ค.
<Source>request</Source>
๊ธฐ๋ณธ๊ฐ: | ์์ฒญ |
Presence: | ์ ํ์ฌํญ |
์ ํ: |
๋ฌธ์์ด. ์ ํจํ ๊ฐ: ์์ฒญ, ์๋ต ๋๋ ๋ฉ์์ง. |
<StringValueLength> ์์
๋ฌธ์์ด ๊ฐ์ ํ์ฉ๋๋ ์ต๋ ๊ธธ์ด๋ฅผ ์ง์ ํฉ๋๋ค.
<StringValueLength>500</StringValueLength>
๊ธฐ๋ณธ๊ฐ: | ์ด ์์๋ฅผ ์ง์ ํ์ง ์๊ฑฐ๋ ์์ ์ ์๋ฅผ ์ง์ ํ๋ฉด ์์คํ ์์ ํ๋๋ฅผ ์ ์ฉํ์ง ์์ต๋๋ค. |
Presence: | ์ ํ์ฌํญ |
์ ํ: | ์ ์ |
์ค๋ฅ ์ฐธ์กฐ
์ด ์น์ ์์๋ ๋ฐํ๋๋ ์ค๋ฅ ์ฝ๋ ๋ฐ ์ค๋ฅ ๋ฉ์์ง์ ์ด ์ ์ฑ ์ด ์ค๋ฅ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ๋ Apigee์์ ์ค์ ํ ์ค๋ฅ ๋ณ์๋ฅผ ์ค๋ช ํฉ๋๋ค. ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค๋ฅ ๊ท์น์ ๊ฐ๋ฐ ์ค์ธ ๊ฒฝ์ฐ, ์ด ์ ๋ณด๋ ์ค์ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ ์ฑ ์ค๋ฅ์ ๋ํด ์์์ผ ํ ์ฌํญ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ฐํ์ ์ค๋ฅ
์ด๋ฌํ ์ค๋ฅ๋ ์ ์ฑ ์ด ์คํ๋ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ค๋ฅ ์ฝ๋ | HTTP ์ํ | ์์ธ | ์์ |
---|---|---|---|
steps.jsonthreatprotection.ExecutionFailed |
500 |
JSONThreatProtection ์ ์ฑ
์ผ๋ก ์ธํด ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ ExecutionFailed ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ค๋ฅ์ ๋๋ถ๋ถ์ ์ ์ฑ
์ ์ค์ ๋ ํน์ ์๊ณ๊ฐ์ ์ด๊ณผํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ์ ํ์ ์ค๋ฅ์๋
๊ฐ์ฒด ํญ๋ชฉ ์ด๋ฆ ๊ธธ์ด,
๊ฐ์ฒด ํญ๋ชฉ ์,
๋ฐฐ์ด ์์ ์,
์ปจํ
์ด๋ ๊น์ด,
๋ฌธ์์ด ๋ฌธ์์ด ๊ฐ ๊ธธ์ด๊ฐ ํฌํจ๋ฉ๋๋ค.
์ด ์ค๋ฅ๋ ํ์ด๋ก๋์ ์๋ชป๋ JSON ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์์ ๋๋ ๋ฐ์ํฉ๋๋ค.
|
build |
steps.jsonthreatprotection.SourceUnavailable |
500 |
์ด ์ค๋ฅ๋ <Source> ์์์ ์ง์ ๋ ๋ฉ์์ง ๋ณ์๊ฐ ๋ค์ ์ค ํ๋์ผ ๋ ๋ฐ์ํฉ๋๋ค.
|
build |
steps.jsonthreatprotection.NonMessageVariable |
500 |
์ด ์ค๋ฅ๋ <Source> ์์๊ฐ ๋ฉ์์ง ์ ํ์ด ์๋ ๋ณ์๋ก ์ค์ ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค. |
build |
๋ฐฐํฌ ์ค๋ฅ
์์.
์ค๋ฅ ๋ณ์
์ด๋ฌํ ๋ณ์๋ ์ด ์ ์ฑ ์ผ๋ก ์ค๋ฅ๊ฐ ํธ๋ฆฌ๊ฑฐ๋ ๋ ์ค์ ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ ์ฑ ์ค๋ฅ์ ๋ํด ์์์ผ ํ ์ฌํญ์ ์ฐธ์กฐํ์ธ์.
๋ณ์ | ์ฅ์ | ์ |
---|---|---|
fault.name="fault_name" |
fault_name์ ์์ ๋ฐํ์ ์ค๋ฅ ํ์ ๋์ด๋ ์ค๋ฅ ์ด๋ฆ์ ๋๋ค. ์ค๋ฅ ์ด๋ฆ์ ์ค๋ฅ ์ฝ๋์ ๋ง์ง๋ง ๋ถ๋ถ์ ๋๋ค. | fault.name Matches "SourceUnavailable" |
jsonattack.policy_name.failed |
policy_name์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ ์ ์ฑ ์ ์ฌ์ฉ์ ์ง์ ์ด๋ฆ์ ๋๋ค. | jsonattack.JTP-SecureRequest.failed = true |
์ค๋ฅ ์๋ต ์์
{ "fault": { "faultstring": "JSONThreatProtection[JPT-SecureRequest]: Execution failed. reason: JSONThreatProtection[JTP-SecureRequest]: Exceeded object entry name length at line 2", "detail": { "errorcode": "steps.jsonthreatprotection.ExecutionFailed" } } }
์ค๋ฅ ๊ท์น ์์
<FaultRule name="JSONThreatProtection Policy Faults">
<Step>
<Name>AM-CustomErrorResponse</Name>
<Condition>(fault.name Matches "ExecutionFailed") </Condition>
</Step>
<Condition>(jsonattack.JPT-SecureRequest.failed = true) </Condition>
</FaultRule>
์คํค๋ง
์ฌ์ฉ ์ฐธ๊ณ ์ฌํญ
XML ๊ธฐ๋ฐ ์๋น์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก JSON(JavaScript Object Notation)์ ์ง์ํ๋ API๋ ์ฝํ ์ธ ๋ฑ๊ธ ๊ณต๊ฒฉ์ ์ทจ์ฝํฉ๋๋ค. ๊ฐ๋จํ JSON ๊ณต๊ฒฉ์ JSON ํ์์ ๋ถ๋ด์ ์ฃผ์ด ์๋น์ค๋ฅผ ๋น์ ์ ์ข ๋ฃํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์์ค์ ์๋น์ค ๊ฑฐ๋ถ ๊ณต๊ฒฉ์ ์ ๋ํ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ ์ค์ ์ ์ ํ์ฌํญ์ด๋ฉฐ ์ ์ฌ์ ์ทจ์ฝ์ ์ ๋ง๊ฒ ์๋น์ค ์๊ตฌ์ฌํญ์ ์ต์ ํํ๋๋ก ๋ฏธ์ธ ์กฐ์ ํด์ผ ํฉ๋๋ค.
๊ด๋ จ ์ฃผ์
RegularExpressionProtection ์ ์ฑ