코딩과로그

API 게이트웨이에 제한 추가하기 본문

Devops/실습

API 게이트웨이에 제한 추가하기

피리음 2023. 5. 10. 13:29

이전 실습 의 연장선입니다.

POST 전용으로만 작동하게 만들기


  1. 람다의 게이트웨이에 접속한다.
  2. 기존 ANY 를 제거한다. (ANY: 모든 메서드 (CRUD)를 의미함)
  3. POST 를 추가한다.
  4. API 배포 를 한다.
  1. 적용됐는 지 테스트
  • 람다 페이지로 이동하여 ENDPOINT 확인

  • GET 로는 접속이 되지 않는 것을 확인

    curl https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0
    # 접속 실패
    {"message":"Missing Authentication Token"}
  • POST 로 접속이 가능함을 확인

    curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0
    # 접속 성공
    {"statusCode":200,"body":"OK!"}

API 키를 이용한 인증 추가하기


1. 요청 시 API 키가 필요하도록 변경

  • 2. API 키 생성

  • 3. API 키 의 사용 계획 생성

  • 4. 사용 계획 을 Gateway 사용처 및 API Key 와 연결

  • 사용할 API 키 지정

  • 어느 Gateway 에 사용할 지 지정

5. 정상적으로 적용이 되었는 지 테스트

  • API 키값을 넣지 않고 요청해봄. 정상적으로 접근 금지됨 을 확인함.

    ❯ curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0

    결과:

     {"message":"Forbidden"}
  • API 키 값 복사

  • API 키를 추가하여 테스트 진행함. 정상적으로 접근이 됨 을 확인함.

    curl -X POST -H "x-api-key: 9mPTwyxSTD1oCYEcz****************" https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0 
    

    결과:

     {"statusCode":200,"body":"OK!"}

권한 부여자를 이용한 인증 부여하기 (토큰 기반)


1. 권한 부여자 함수로 사용될 Lambda 생성 및 배포 (위 사진에서 Lambda Auth function 에 해당하는 것을 만드는 것임)

  • 함수 생성

  • 아래 함수 복사 (권한 관련 내용임 자세한 내용은 공식 문서 참고)

    export const handler =  function(event, context, callback) {
      var token = event.authorizationToken;
      switch (token) {
          case 'allow':
              callback(null, generatePolicy('user', 'Allow', event.methodArn));
              break;
          case 'deny':
              callback(null, generatePolicy('user', 'Deny', event.methodArn));
              break;
          case 'unauthorized':
              callback("Unauthorized");   // Return a 401 Unauthorized response
              break;
          default:
              callback("Error: Invalid token"); // Return a 500 Invalid token response
      }
    };
    
    // Help function to generate an IAM policy
    var generatePolicy = function(principalId, effect, resource) {
      var authResponse = {};
    
      authResponse.principalId = principalId;
      if (effect && resource) {
          var policyDocument = {};
          policyDocument.Version = '2012-10-17'; 
          policyDocument.Statement = [];
          var statementOne = {};
          statementOne.Action = 'execute-api:Invoke'; 
          statementOne.Effect = effect;
          statementOne.Resource = resource;
          policyDocument.Statement[0] = statementOne;
          authResponse.policyDocument = policyDocument;
      }
    
      // Optional output with custom properties of the String, Number or Boolean type.
      authResponse.context = {
          "stringKey": "stringval",
          "numberKey": 123,
          "booleanKey": true
      };
      return authResponse;
    }
  • 코드 편집기에 복사한 코드를 넣은 뒤 배포 (Deploy)

2. 방금 만들었던 Lambda 함수를 권한 부여자 함수로 설정

  • 이전에 만들었던 람다 함수(AuthFunction)를 권한 부여자 함수로 정의함
  • 권한 부여자 함수가 정상동작함을 테스트.
    • allow 를 입력해서 정상동작하면 작동되는 것임
    • allow 인 이유: 이전에 복붙한 람다 코드에서 그렇게 정의하였기 때문임

      3. 권한 부여자 함수를 사용할 메소드에 권한부여자 함수 연결

  • 권한 부여자 함수 연결
  • API 배포

4. 정상적으로 권한부여자가 적용되었는 지 확인

  • 잘못된 권한 부여자 토큰값을 넣은 경우 (실패함을 확인)
    $ curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0 \
    -H "x-api-key: 9mPTwyxSTD1oCYEczPoEl25khzi***" \
    -H "authorizationToken: wrong-token"
    결과 실패:
    {"message":null}

    테스트 시의 헤더에 사용되는 x-api-keyAPI 키를 이용한 인증 추가하기 에서 진행했던 것을 그대로 사용하는 중임.

  • 정상적인 인증 토큰을 넣은 경우 (정상적으로 접속이 됨을 확인)
    $ curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0 \
     -H "x-api-key: 9mPTwyxSTD1oCYEczPoEl25khziN844zEHsKcfK2" \
     -H "authorizationToken: allow"
    결과 성공:
    {"statusCode":200,"body":"OK!"}

참고자료 :
공식 문서
https://liveloper-jay.tistory.com/98

'Devops > 실습' 카테고리의 다른 글

SAM 을 활용한 Lambda 배포 실습 (feat: DynamoDB)  (0) 2023.05.10