코딩과로그
API 게이트웨이에 제한 추가하기 본문
이전 실습 의 연장선입니다.
POST 전용으로만 작동하게 만들기
- 람다의 게이트웨이에 접속한다.
- 기존
ANY
를 제거한다. (ANY: 모든 메서드 (CRUD)를 의미함) POST
를 추가한다.API 배포
를 한다.
- 적용됐는 지 테스트
람다 페이지로 이동하여 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!"}
'Devops > 실습' 카테고리의 다른 글
SAM 을 활용한 Lambda 배포 실습 (feat: DynamoDB) (0) | 2023.05.10 |
---|