구글 클라우드 인사이트 Apigee를 이용한 API 보안 Policy 적용하기 구글 인사이트 by Miyeon. Jo 2021년 05월 03일 2021년 05월 03일 483 목차보안 개요API Proxy 만들기Product 생성하기Developer 생성하기App 생성하기API Proxy에 VerifyAPIKey Policy 추가하기API Proxy에 OAuth v2.0 Policy 추가하기OAuth token 생성하기내용1. 보안 개요API 보안에는 API에 대한 액세스 제어, 악성 메시지 콘텐츠 차단, 런타임 시 민감한 암호화 데이터에 액세스 및 마스킹, 백엔드 서비스에 대한 직접 액세스 차단 및 기타 중요한 보호 장치가 포함됩니다.Apigee Edge는 아래 나열된 것처럼 Apigee에 내장된 Security Policy를 이용하여 다양한 보안기능을 적용할 수 있습니다.이 글에서는 Apigee Edge Security Policy중 Verify API Key와 OAuth v2.0 Policy에 대하여 다루어 보도록 하겠습니다.사전 준비사항Google Apigee 에 가입이 되어 있지 않을 경우 아래 링크를 참고하여 Apigee에 가입하여 주시기 바랍니다.Apigee 시작하기2. API Proxy 만들기1) https://apigee.com/edge에 로그인합니다.2) 기본 창에서 API Proxies 를 클릭합니다.3) +Proxy 를 클릭합니다.4) Reverse proxy을 클릭합니다.5) 아래 내용을 입력합니다.PropertyValueNamelab1a-v1Base path/lab1a/v1/getipTargethttp://httpbin.org/ip6) 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 패널에 아래 내용을 입력합니다.PropertyValueNamelab-1aDisplay namelab-1aEnvironmenttestAccessPublic3) 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 패널에서 아래 내용을 입력합니다.PropertyValueNamelab1aDisplay namelab1aApp typeDeveloperDeveloperTask 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-VerifyToken5) 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) 아래 내용을 입력합니다.PropertyValueNameoauthv2Base path/oauth/client_credential5) Next 클릭합니다.6) Next 클릭합니다.7) Next 클릭합니다.8) test 환경에 deploy하기 위해 test 선택 후 Create and deploy 클릭합니다.9) Edit proxy 버튼을 클릭합니다.10) Develop tab을 선택합니다.11) Proxy Endpoints > default > [+] 클릭하여 RefreshAccessToken flow 추가PropertyValueFlow NameRefreshAccessTokenDescriptionemptyCondition TypePath and VerbPath/refresh_accesstokenVerbPOSTOption Target URLempty12) Proxy Endpoints > default > + 클릭하여 AccessTokenClientCredential flow 추가PropertyValueFlow NameAccessTokenClientCredentialDescriptionemptyCondition TypePath and VerbPath/accesstokenVerbPOSTOption Target URLempty13) RefreshAccessToken flow에 OAuthV2 policy를 추가하기 위해 +Step 클릭합니다.14) OAuth v2.0 policy를 선택 후 display name을 변경합니다.RefreshAccessToken15) 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을 아래 내용으로 변경합니다.GenerateAccessTokenClient19) 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를 호출합니다.PropertyValueVerbPOSTURLhttps://your-domain/lab_oauth/client_credential/accesstoken?grant_type=client_credentialsheader: AuthorizationBasic {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 2YiJtyIRcG2nvkv2jyO4XQG9ef5) token 값을 저장합니다.8.3 token을 사용하여 API 호출하기1) Postman Tool을 이용하여 접속을 시도합니다.PropertyValueVerbGETURLhttps://your-domain/lab1a/v1/getipheader: AuthorizationBearer {token}상태코드 200 OK와 아래 와 같은 메세지가 리턴됩니다.{ "origin": "58.151.93.2, 34.92.3.9" } 출처 및 참고사이트https://cloud.google.com/apigeehttps://docs.apigee.com