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

문한성·2023년 5월 10일
0

부트캠프

목록 보기
83/123
post-thumbnail

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

API 게이트웨이에 제한을 걸어서 권한이 있는 사용자만 접근이 가능하도록 설정할 수 있습니다.

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


  1. 람다의 게이트웨이에 접속한다.

  2. 기존 ANY 를 제거한다. (ANY: 모든 메서드 (CRUD)를 의미함)

  3. POST 를 추가한다.



  1. 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-key 는 API 키를 이용한 인증 추가하기 에서 진행했던 것을 그대로 사용하는 중임.

  • 정상적인 인증 토큰을 넣은 경우 (정상적으로 접속이 됨을 확인)결과 성공:
    $ 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

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글