[AWS] Lambda Authorizer @JWT

xgro·2022년 8월 4일
0

AWS

목록 보기
7/19

AWS 공식 문서 그림

Lambda Authorizer 코드는 깃허브 저장소에서 확인할 수 있습니다.

📌 권한부여자란?

Lambda 권한 부여자(이전 사용자 지정 권한 부여자)는 Lambda 함수를 사용하여 API 메서드에 대한 액세스를 제어하는 API Gateway 기능입니다.

Lambda 권한 부여자는 두 가지 유형이 있습니다.

토큰 기반 Lambda 권한 부여자(TOKEN 권한 부여자라고도 함)는 보유자 토큰(JSON Web Token(JWT) 또는 OAuth 토큰)에 있는 호출자의 자격 증명을 받습니다. 예제 애플리케이션은 GitHub의 Open Banking Brazil - Authorization Samples를 참조하십시오.

요청 파라미터 기반 Lambda 권한 부여자(REQUEST 권한 부여자라고도 함)는 헤더, 쿼리 문자열 파라미터, stageVariables 및 $context 변수의 조합으로 호출자의 자격 증명을 수신합니다.

WebSocket API의 경우 요청 파라미터 기반 유형 권한 부여자만 지원됩니다.

👉 어디에 사용하는가?

서비스하고자 하는 애플리케이션의 JWT를 비롯한 다양한 verify 기능을 API-Gateway에서 처리함으로서 인증 서버에서 처리함으로서 매번 요청에 대해 서버가 인증을 거치지 않아 최소한의 비용으로 인증 기능을 이용할 수 있습니다.

👉 Lambda 권한 부여자 함수 생성

verify 역할을 담당하는 Lambda 함수를 생성합니다.

이 블로그에서는 Javascript를 이용하여 함수를 생성합니다.

jwt verify에 필요한 jsonwebtoken 의존성 모듈을 배포하기 위해 serverless framework을 사용하여 로컬의 lambda 함수를 aws 서비스로 배포합니다.

✅ How it works?

  1. event.headers.authorization의 값을 type과 token으로 분류하여 저장합니다.
  2. Secret값을 이용하여 시그니처의 무결성을 검증합니다.
  3. 인증 타입이 Bearer인지 확인합니다.
  4. 2. 3. 모두 참이면 해당 경로를 통해 통합되어 있는 대상으로 요청을 Allow 하고, 그렇지 않으면 요청을 Deny하는 정책을 반환합니다.

API가 메서드 요청을 받을 때 API Gateway가 소스 토큰을 이 Lambda 권한 부여자 함수의 event.headers.authorization 속성에 전달합니다. Lambda 권한 부여자 함수는 토큰을 읽고 다음과 같이 동작합니다.

  • 토큰 값이 'allow'인 경우 권한 부여자 함수는 200 OK HTTP 응답 및 다음과 같은 IAM 정책을 반환하고 메서드 요청이 성공합니다.
    
    {
      "Version": "2012-10-17",
      "Statement": [{
          "Action": "execute-api:Invoke",
          "Effect": "Allow",
          "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/"
        }
      ]
    }
  • 토큰 값이 'deny'인 경우 권한 부여자 함수는 403 Forbidden HTTP 응답 및 다음과 같은 Deny IAM 정책을 반환하고 메서드 요청이 실패합니다.
    
    {
      "Version": "2012-10-17",
      "Statement": [{
          "Action": "execute-api:Invoke",
          "Effect": "Deny",
          "Resource": "arn:aws:execute-api:us-east-1:123456789012:ivdtdhp7b5/ESTestInvoke-stage/GET/"
        }
      ]
    }
  • 토큰 값이 'unauthorized'이나 빈 문자열인 경우 권한 부여자 함수는 401 Unauthorized HTTP 응답을 반환하고 메서드 호출이 실패합니다.
  • 그 외 토큰의 경우 클라이언트는 500 Invalid token 응답을 수신하고, 메서드 호출은 실패합니다.

✅ How it use?

  1. 배포를 선택합니다.
  2. 단순 API가 없을 경우 API Gateway 콘솔에서 만듭니다.
  3. API 목록에서 해당 API를 선택합니다.
  4. 권한 부여자를 선택합니다.
  5. 새로운 권한 부여자 생성을 선택합니다.
  6. 권한 부여자 이름을 입력합니다.
  7. 유형에 대해 Lambda를 선택합니다.
  8. Lambda 함수에서 Lambda 권한 부여자 함수를 만든 리전을 선택하고 드롭다운 목록에서 함수 이름을 선택합니다.
  9. Lambda 호출 역할을 비워 둡니다.
  10. Lambda 이벤트 페이로드의 경우 토큰을 선택합니다.
  11. 토큰 소스에 authorizationToken을 입력합니다.
  12. 생성을 선택한 다음 Grant & Create(권한 부여 및 생성)를 선택합니다.
  13. 테스트를 선택합니다.
  14. 인증 토큰 값에 allow를 입력합니다.
  15. 테스트를 선택합니다.

✅ 참조 레퍼런스

profile
안녕하세요! DevOps 엔지니어 이재찬입니다. 블로그에 대한 피드백은 언제나 환영합니다! 기술, 개발, 운영에 관한 다양한 주제로 함께 나누며, 더 나은 협업과 효율적인 개발 환경을 만드는 과정에 대해 인사이트를 나누고 싶습니다. 함께 여행하는 기분으로, 즐겁게 읽어주시면 감사하겠습니다! 🚀

0개의 댓글