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

sang yun Lee·2023년 5월 10일
0

Devops 실습

목록 보기
2/21
post-thumbnail

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

목표

API 게이트웨이에 접근제한을 3가지 적용해보기
1. POST 전용으로만 작동하게 만들기
2. API 키를 이용한 인증 추가하기
3. 권한 부여자를 이용한 인증 부여하기 (토큰 기반)

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. 권한 부여자 함수를 사용할 메소드에 권한부여자 함수 연결

Authrization 에 만들었던 auth 가 조금 늦게 나올 수 있다. 최대 5분간 기다려야 나올 수 있다.

  • 권한 부여자 함수 연결
  • 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

0개의 댓글