이전 실습 의 연장선입니다.
API 게이트웨이에 접근제한을 3가지 적용해보기
1. POST 전용으로만 작동하게 만들기
2. API 키를 이용한 인증 추가하기
3. 권한 부여자를 이용한 인증 부여하기 (토큰 기반)
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 키
가 필요하도록 변경API 키
생성API 키
의 사용 계획 생성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!"}
함수 생성
아래 함수 복사 (권한 관련 내용임 자세한 내용은 공식 문서 참고)
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)
allow
를 입력해서 정상동작하면 작동되는 것임allow
인 이유: 이전에 복붙한 람다 코드에서 그렇게 정의하였기 때문임 Authrization 에 만들었던
auth
가 조금 늦게 나올 수 있다. 최대 5분간 기다려야 나올 수 있다.
$ 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!"}