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

문한성·2023년 5월 10일
0

부트캠프

목록 보기
83/123
post-thumbnail

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

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

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


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

    https://velog.velcdn.com/images/sororiri/post/e1d05e64-82d7-4ed9-b09f-653d890465c3/image.png

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

    https://velog.velcdn.com/images/sororiri/post/0fff8931-377c-4e40-a23f-67c3b7d11604/image.png

  3. POST 를 추가한다.

  • https://velog.velcdn.com/images/sororiri/post/9d713c98-54bd-40e8-9c99-461651ed4499/image.png
  • https://velog.velcdn.com/images/sororiri/post/06be2ceb-fa3b-464a-b3b5-dd6fda6bc610/image.png
  1. API 배포 를 한다.
  • https://velog.velcdn.com/images/sororiri/post/dfb9b975-48d4-4938-9472-fd0f857a83ac/image.png
  • https://velog.velcdn.com/images/sororiri/post/04ad13e1-0aed-42a3-a150-d058d6d34926/image.png
  1. 적용됐는 지 테스트
  • 람다 페이지로 이동하여 ENDPOINT 확인 https://velog.velcdn.com/images/sororiri/post/0dbe4f60-ffa2-476d-9975-5fb4f2f514b9/image.png
  • 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 키가 필요하도록 변경

  • https://velog.velcdn.com/images/sororiri/post/cff0b477-f8c0-4b2f-85b4-246485182a4a/image.png
  • https://velog.velcdn.com/images/sororiri/post/1d7ffa76-fd10-474f-89a1-afc1be6e8c53/image.png
  • https://velog.velcdn.com/images/sororiri/post/60945437-698c-412e-ba1b-ab9952f35ff6/image.png

2. API 키 생성

  • https://velog.velcdn.com/images/sororiri/post/53f573d4-f13b-43e9-b311-864f61369bff/image.png
  • https://velog.velcdn.com/images/sororiri/post/8359c17c-c7bf-48d5-ad76-181808dd39cb/image.png
  • https://velog.velcdn.com/images/sororiri/post/6b85b00e-244a-4971-b987-71b9925a059c/image.png

3. API 키 의 사용 계획 생성

  • https://velog.velcdn.com/images/sororiri/post/d6c4d2e4-22d9-4a90-92a3-b4ba764e1b05/image.png
  • https://velog.velcdn.com/images/sororiri/post/dd68a291-e806-4813-a62a-bea851096346/image.png

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

  • 사용할 API 키 지정 https://velog.velcdn.com/images/sororiri/post/52ea7e80-9765-4f59-9366-7cf5dc763049/image.png
  • 어느 Gateway 에 사용할 지 지정 https://velog.velcdn.com/images/sororiri/post/c229d623-061c-49ae-968f-210a0541124e/image.png

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

  • API 키값을 넣지 않고 요청해봄. 정상적으로 접근 금지됨 을 확인함.
     ❯ curl -X POST https://ffvbmhwdzj.execute-api.ap-northeast-2.amazonaws.com/default/sam-app-LambdaPutDynamoDB-2dGVtrg4bGp0
    결과:
      {"message":"Forbidden"}
  • API 키 값 복사 https://velog.velcdn.com/images/sororiri/post/142b99c8-761c-44f3-b560-bfdefe2d23c7/image.png
  • 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!"}

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


https://velog.velcdn.com/images/sororiri/post/a6154e10-e1f8-4bd2-90ff-79122eb58146/image.png

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

  • 함수 생성 https://velog.velcdn.com/images/sororiri/post/82bd196c-a703-4f31-888f-6132c15adfb5/image.png
  • https://velog.velcdn.com/images/sororiri/post/0f6b8078-fe9c-41a9-a98b-e6b6ed74d19a/image.png
  • 아래 함수 복사 (권한 관련 내용임 자세한 내용은 공식 문서 참고)
    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) https://velog.velcdn.com/images/sororiri/post/910e8b62-c231-45da-a46d-5751a5273f62/image.png

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

  • 이전에 만들었던 람다 함수(AuthFunction)를 권한 부여자 함수로 정의함 https://velog.velcdn.com/images/sororiri/post/659891d6-0089-4a46-b81b-46efd06f92a8/image.png
  • 권한 부여자 함수가 정상동작함을 테스트.
    • allow 를 입력해서 정상동작하면 작동되는 것임
    • allow 인 이유: 이전에 복붙한 람다 코드에서 그렇게 정의하였기 때문임 https://velog.velcdn.com/images/sororiri/post/9bebf87e-202d-4f1b-bc0b-8c468c1608d5/image.png

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

  • 권한 부여자 함수 연결 https://velog.velcdn.com/images/sororiri/post/a78cc043-a0e6-48fa-a826-4d31e5154b40/image.png
  • API 배포 https://velog.velcdn.com/images/sororiri/post/a2dcc422-e99b-449c-bb25-fc0ddefbf26b/image.png

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개의 댓글