내용
1. 보안 개요
API 보안에는 API에 대한 액세스 제어, 악성 메시지 콘텐츠 차단, 런타임 시 민감한 암호화 데이터에 액세스 및 마스킹, 백엔드 서비스에 대한 직접 액세스 차단 및 기타 중요한 보호 장치가 포함됩니다.
Apigee Edge는 아래 나열된 것처럼 Apigee에 내장된 Security Policy를 이용하여 다양한 보안기능을 적용할 수 있습니다.

이 글에서는 Apigee Edge Security Policy중 Verify API Key와 OAuth v2.0 Policy에 대하여 다루어 보도록 하겠습니다.
사전 준비사항
Google Apigee 에 가입이 되어 있지 않을 경우 아래 링크를 참고하여 Apigee에 가입하여 주시기 바랍니다.
2. API Proxy 만들기
1) https://apigee.com/edge에 로그인합니다.
2) 기본 창에서 API Proxies 를 클릭합니다.
3) +Proxy 를 클릭합니다.
4) Reverse proxy을 클릭합니다.
5) 아래 내용을 입력합니다.
Property | Value |
---|---|
Name | lab1a-v1 |
Base path | /lab1a/v1/getip |
Target | http://httpbin.org/ip |
6) Next 를 클릭합니다.
7) Security:Authorization에서 Pass through(권한 없음)을 선택 후, Next 를 클릭합니다.
8) Virtual hosts 페이지에서, default 와 secure를 선택 후, Next 를 클릭합니다.
9) test 환경에 deploy하기 위해 test 선택 후 Create and deploy 클릭합니다.
3. Product 생성하기
1) 왼쪽 메뉴탭에서 Publish > Products 를 클릭합니다.
2) Product details 패널에 아래 내용을 입력합니다.
Property | Value |
---|---|
Name | lab-1a |
Display name | lab-1a |
Environment | test |
Access | Public |
3) API Resource 패널에서 Add a proxy 링크를 클릭합니다.

4) 팝업창에서 lab1-v1 를 선택 후 Add(1) 버튼을 클릭합니다.

5) 오른쪽 상단의 SAVE 버튼을 클릭합니다.
6) 생성한 Product 정보를 확인합니다.

4. Developer 생성하기
1) Publish > Developers 를 클릭합니다.
2) +Developer 클릭합니다.
3) first name, last name, username, email을 입력한 후 Create 버튼을 클릭합니다.

5. App 생성하기
1) Publish > Apps 를 클릭합니다.
2) +App 클릭합니다.
3) App details 패널에서 아래 내용을 입력합니다.
Property | Value |
---|---|
Name | lab1a |
Display name | lab1a |
App type | Developer |
Developer | Task 3에서 생성한 developer 선택 |
4) Credentials 패널에서 Add product를 클릭, lab-1a 선택 후 Add(1) 버튼을 클릭합니다. 우측 상단의 Create 버튼을 클릭합니다.

Key 및 Secret 이 해당 app에 구성되었습니다.
5) 생성된 App의 상세 정보를 확인합니다.

6) Key 옆에 있는 Show를 클릭한 후 API key 를 저장합니다. proxy 를 호출할때 복사해둔 api key 를 사용합니다.
6. API Proxy에 VerifyAPIKey Policy 추가하기
1) API Proxies 페이지에 접속합니다.
2) lab1a-v1 proxy를 클릭, Develop tab을 선택합니다.
3) Proxy Endpoints > default > PreFlow > +Step > Verify Api Key 선택 > Add 버튼을 클릭합니다.

4) 좌측 상단의 Save 클릭합니다.
6.1 VerifyAPIKey Policy 테스트하기
1) 우측 상단의 Trace 탭을 클릭합니다.
2) Start Trace Session 버튼 클릭합니다, VerifyAPIKey Proxy 테스트를 위해 Send 버튼을 클릭합니다. 올바른 API key가 없기 때문에 401 error가 리턴됩니다.
3) URL에 ?apikey=123을 추가 후 Send 버튼을 클릭합니다. 이번 테스트에도 API key가 잘못되었기 때문에 401 error가 리턴됩니다.

4) Publish > Apps > Lab1a 에서 key를 복사하여 123 값을 대체한 후 Send 클릭
VerifyAPIKey policy 가 통과되고, proxy는 200을 리턴합니다.

7. API Proxy에 OAuth v2.0 Policy 추가하기
7.1 새로운 Revision으로 저장
1) API proxies 목록에서 lab1a-v1 클릭합니다.
2) Project menu 클릭 후 Save as new revision 을 선택합니다.
변경 전으로 원복이 필요할 경우를 대비하여 이전 revision은 유지됩니다.
3) test 환경에 새로운 revision을 deploy하기 위해, Deployment menu에서 test를 클릭, 알림창에서 Deploy를 클릭합니다.
7.2 VerifyAPIKey policy 대신 OAuthV2 policy 추가
1) API proxies 목록에서 lab1a-v1 클릭합니다.
2) Develop tab에서 Proxy Endpoints > default > PreFlow 선택
VerifyAPIKey policy를 삭제합니다.

3) Request PreFlow에 OAuthV2 policy를 추가하기 위해 +Step 클릭합니다.
4) OAuth v2.0 policy를 선택 후 display name을 변경합니다.
O2-VerifyToken
5) Add 를 클릭합니다.

정책은 인증 헤더의 표준 위치에서 OAuth 토큰을 찾습니다. 헤더 값은 다음과 같습니다.
Bearer {token}
6) Save 버튼을 클릭합니다.
7.3 Trace를 이용하여 변경내용 확인
1) Trace tab을 클릭합니다.
2) Start Trace Session 버튼 클릭, URL에 /lab1a-v1을 추가 후 Send 클릭
access token이 잘못되었기 때문에 401 error 가 리턴됩니다.
{
"fault": {
"faultstring": "Invalid access token",
"detail": {
"errorcode": "oauth.v2.InvalidAccessToken"
}
}
}
8. OAuth token 생성하기
8.1 OAuth token 생성을 위한 API 만들기
1) Develop > API Proxies 클릭합니다.
2) +Proxy를 클릭합니다.
3) No target 클릭합니다.
4) 아래 내용을 입력합니다.
Property | Value |
---|---|
Name | oauthv2 |
Base path | /oauth/client_credential |
5) Next 클릭합니다.
6) Next 클릭합니다.
7) Next 클릭합니다.
8) test 환경에 deploy하기 위해 test 선택 후 Create and deploy 클릭합니다.
9) Edit proxy 버튼을 클릭합니다.
10) Develop tab을 선택합니다.
11) Proxy Endpoints > default > [+] 클릭하여 RefreshAccessToken flow 추가
Property | Value |
---|---|
Flow Name | RefreshAccessToken |
Description | empty |
Condition Type | Path and Verb |
Path | /refresh_accesstoken |
Verb | POST |
Option Target URL | empty |
12) Proxy Endpoints > default > + 클릭하여 AccessTokenClientCredential flow 추가
Property | Value |
---|---|
Flow Name | AccessTokenClientCredential |
Description | empty |
Condition Type | Path and Verb |
Path | /accesstoken |
Verb | POST |
Option Target URL | empty |
13) RefreshAccessToken flow에 OAuthV2 policy를 추가하기 위해 +Step 클릭합니다.
14) OAuth v2.0 policy를 선택 후 display name을 변경합니다.
RefreshAccessToken
15) Add 를 클릭합니다.
16) Editor 영역의 내용을 아래 내용으로 변경합니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 name="RefreshAccessToken">
<Operation>RefreshAccessToken </Operation>
<!-- This is in millseconds, so expire in half an hour -->
<ExpiresIn>1800000</ExpiresIn>
<GrantType>request.queryparam.grant_type</GrantType>
<GrantType>request.queryparam.grant_type</GrantType>
<GenerateResponse/>
</OAuthV2>

17) AccessTokenClientCredential flow에 OAuthV2 policy를 추가하기 위해 +Step 을 클릭합니다.
18) OAuth v2.0 policy를 선택 후 display name을 아래 내용으로 변경합니다.
GenerateAccessTokenClient
19) Add 를 클릭합니다.
20) Editor 영역의 내용을 아래 내용으로 변경합니다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OAuthV2 name="GenerateAccessTokenClient">
<Operation>GenerateAccessToken</Operation>
<!-- This is in millseconds, so expire in an hour -->
<ExpiresIn>3600000</ExpiresIn>
<SupportedGrantTypes>
<GrantType>client_credentials</GrantType>
</SupportedGrantTypes>
<GrantType>request.queryparam.grant_type</GrantType>
<GenerateResponse/>
</OAuthV2>

21) Save 버튼을 클릭합니다.
22) test 환경에 디플로이하기 위해 Deployment > test 를 클릭합니다.
8.2 OAuth token 생성
1) Publish > Apps 목록에서 Lab1a app을 선택합니다.
2) Key, Secret의 Show를 클릭한 후 복사합니다.
3) Request에 대한 Basic Authentication header를 만들어야 됩니다. username이 key값이고, 패스워드가 Secret값입니다.
아래와 같이 Postman을 이용하여 Basic Authentication header를 만들 수 있습니다.

기본 인증 헤더는 Authorization이라는 헤더를 사용하며 값은 “Basic” 문자열과 Base64 인코딩 문자열입니다. 인코딩 전 문자열은 콜론(“:”)으로 구분된 키 및 암호입니다.
echo 명령어를 이용하여 base64 문자열을 생성할 수 있습니다.
echo -n "FpZombx20jYKQ3iS7F0ZT9lLlAW3bxqr:L8CiJ1b5GuFY9Ejk" | base64
아래와 같은 결과를 볼 수 있습니다.
RnBab21ieDIwallLUTNpUzdGMFpUOWxMbEFXM2J4cXI6TDhDaUoxYjVHdUZZOUVqaw==
인증 해더 값은 다음과 같습니다.
Basic
RnBab21ieDIwallLUTNpUzdGMFpUOWxMbEFXM2J4cXI6TDhDaUoxYjVHdUZZOUVqaw==
4) REST tool을 이용하여 request를 호출합니다.
Property | Value |
---|---|
Verb | POST |
URL | https://your-domain/lab_oauth/client_credential/accesstoken?grant_type=client_credentials |
header: Authorization | Basic {Base64 string} |
요청이 성공하면 다음과 같은 응답을 얻을 수 있습니다.
{
"refresh_token_expires_in": "0",
"api_product_list": "[lab-1a]",
"api_product_list_json": [
"lab-1a"
],
"organization_name": "hk-demo4",
"developer.email": "helloworld@apigee.com",
"token_type": "BearerToken",
"issued_at": "1612853536692",
"client_id": "kL8QMQG5eOefZcg8HTm3BGblIVt6AVD4",
"access_token": "2YiJtyIRcG2nvkv2jyO4XQG9ef",
"application_name": "2441fa98-9e86-42b5-95a2-163ce19e16de",
"scope": "",
"expires_in": "3599",
"refresh_count": "0",
"status": "approved"
}
access_token 필드에 액세스 토큰이 포함되어 있습니다. 액세스 토큰은 인증 헤더를 사용하여 전송됩니다. 위에 표시된 액세스 토큰의 경우 인증 헤더 값은 다음과 같습니다.
Bearer 2YiJtyIRcG2nvkv2jyO4XQG9ef
5) token 값을 저장합니다.
8.3 token을 사용하여 API 호출하기
1) Postman Tool을 이용하여 접속을 시도합니다.
Property | Value |
---|---|
Verb | GET |
URL | https://your-domain/lab1a/v1/getip |
header: Authorization | Bearer {token} |

상태코드 200 OK와 아래 와 같은 메세지가 리턴됩니다.
{
"origin": "58.151.93.2, 34.92.3.9"
}