https://tobelinuxer.tistory.com/54
이전 포스트에 이어서
이 페이지에서는 3. Token-based Authorizer 4. Request-based Authorizer에 대해 다루도록 하겠습니다.
1. 개요
- Serverless API와 인증 및 권한 부여의 중요성
2. API Gateway Authorizer 소개
- Token-based Authorizer
- Request-based Authorizer
3. Token-based Authorizer
- Token-based Authorizer 작동 원리
- Token-based Authorizer 구현 예시
4. Request-based Authorizer
- Request-based Authorizer 작동 원리
- Request-based Authorizer 구현 예시
5. 테스트
6. 결론
3. Token-based Authorizer
Token-based Authorizer는 요청에 포함된 인증 토큰을 검증하여 사용자의 인증과 권한을 확인하는 방식입니다.
이번 섹션에서는 Token-based Authorizer를 사용하여 Serverless Framework로 API Gateway에 인증 기능을 추가하는 방법을 설명하겠습니다.
3.1 Token-based Authorizer 작동 원리
Token-based Authorizer의 작동 원리를 이해하려면 다음 단계를 따라야 합니다.
1. 클라이언트는 인증 토큰(JWT, OAuth 등)을 헤더에 포함하여 API 요청을 보냅니다.
2. API Gateway는 요청 헤더에서 토큰을 추출하여 Authorizer Lambda 함수에 전달합니다.
3. Authorizer Lambda 함수는 토큰의 유효성과 서명을 검증하고, 필요한 경우 사용자의 권한을 확인합니다.
4. 검증이 완료되면 Authorizer Lambda 함수는 인증 정책을 생성하여 API Gateway에 반환합니다.
5. API Gateway는 반환된 인증 정책을 기반으로 요청을 허용하거나 거부합니다.
이러한 작동 원리를 바탕으로 Serverless Framework를 사용하여 Token-based Authorizer를 구현해 보겠습니다.
다음 섹션에서는 Authorizer Lambda 함수를 생성하고 API Gateway에 연결하는 방법을 설명합니다.
3.2 Token-based Authorizer 구현하기
이제 Token-based Authorizer를 구현해보겠습니다. 다음 단계를 따라 진행하세요.
1. 먼저, Authorizer Lambda 함수를 생성하겠습니다. src/auth/tokenAuthorizer.ts 파일을 만들고 다음 코드를 추가하세요.
import { APIGatewayTokenAuthorizerHandler, APIGatewayAuthorizerResult } from 'aws-lambda';
const generatePolicy = (principalId: string, effect: string, resource: string): APIGatewayAuthorizerResult => {
return {
principalId: principalId,
policyDocument: {
Version: "2012-10-17",
Statement: [
{
Action: "execute-api:Invoke",
Effect: effect,
Resource: resource,
},
],
},
};
};
export const handler: APIGatewayTokenAuthorizerHandler = async (event) => {
const token = event.authorizationToken;
// 토큰을 검증하는 로직을 작성하세요 (예: JWT 라이브러리 사용)
// ...
console.log(token);
if (token != "test1234") {
return generatePolicy("user", "Deny", event.methodArn);
}
// 검증에 성공하면 인증 정책을 생성하세요
return generatePolicy("user", "Allow", event.methodArn);
};
2. serverless.yml 파일을 열어서 functions 섹션에 Authorizer Lambda 함수를 추가하세요.
functions:
tokenAuthorizer:
handler: src/auth/tokenAuthorizer.handler
3. 이제 API Gateway에 Authorizer를 추가하겠습니다. serverless.yml 파일에서 http 이벤트 속성에 authorizer를 추가하세요.
functions:
appToken:
handler: src/handler.app_handler
events:
- http:
path: /app-token/{proxy+}
method: ANY
cors: true
authorizer:
type: TOKEN
functionName: tokenAuthorizer
identitySource: method.request.header.Authorization
4. 변경 사항을 저장하고 배포하세요.
$ sls deploy
이제 API Gateway는 토큰을 검증하는 Authorizer를 사용하여 요청을 인증합니다.
클라이언트는 Authorization 헤더에 토큰을 포함하여 요청을 보내야 합니다.
토큰이 유효하다면, Authorizer는 정책을 반환하고 API Gateway는 요청을 처리합니다.
토큰이 유효하지 않으면, API Gateway는 401 Unauthorized 응답을 반환합니다.
요약하면, Token-based Authorizer를 사용하면 클라이언트로부터 전달받은 토큰을 검증하고, 인증된 사용자에게만 API에 대한 접근 권한을 부여할 수 있습니다.
이렇게 구현하면 보안이 강화되고, 사용자 인증과 관련된 로직을 분리하여 관리할 수 있습니다.
다음 섹션에서는 Request-based Authorizer에 대해 알아보겠습니다.
4. Request-based Authorizer
Request-based Authorizer는 요청의 헤더, 쿼리 문자열 매개 변수, 경로 매개 변수, 소스 IP 등과 같은 요청 데이터를 기반으로 인증 및 권한 부여를 수행합니다.
예를 들어, 사용자가 특정 리소스에 대한 요청을 보낼 때 요청 헤더에 특정 키와 값을 포함해야 하는 경우 이 유형의 Authorizer를 사용할 수 있습니다.
4.1 Request-based Authorizer 작동 원리
1. 클라이언트가 API Gateway로 요청을 보냅니다.
2. API Gateway는 요청을 받아 Authorizer를 호출하고, 요청 데이터를 전달합니다.
3. Authorizer는 요청 데이터를 기반으로 인증 및 권한 부여 로직을 수행합니다.
4. Authorizer는 권한 문서를 생성하고 API Gateway에 반환합니다.
5. API Gateway는 권한 문서를 기반으로 요청을 수락하거나 거부합니다.
4.2 Request-based Authorizer 구현 예시
serverless.yml 파일에 Request-based Authorizer를 추가하려면 다음과 같이 작성하세요:
functions:
appRequest:
handler: src/handler.app_handler
events:
- http:
path: /app/{proxy+}
method: ANY
cors: true
authorizer:
type: REQUEST
functionName: requestAuthorizer
identitySources:
- method.request.header.CustomHeader
identitySources에는 요청의 헤더, 쿼리 문자열 매개 변수, 경로 매개 변수 등에서 검사할 데이터를 지정할 수 있습니다.
예를 들어, 클라이언트가 요청 헤더에 CustomHeader라는 키로 값을 전달하면, 이 값을 인증 및 권한 부여 로직에 사용할 수 있습니다.
다음은 간단한 Request-based Authorizer Lambda 함수의 예입니다:
import { APIGatewayRequestAuthorizerEvent, APIGatewayAuthorizerResult } from "aws-lambda";
export const handler = async (event: APIGatewayRequestAuthorizerEvent): Promise<APIGatewayAuthorizerResult> => {
const customHeader = event.headers["CustomHeader"];
if (customHeader === "test1234") {
return generatePolicy("user", "Allow", event.methodArn);
} else {
return generatePolicy("user", "Deny", event.methodArn);
}
};
const generatePolicy = (principalId: string, effect: string, resource: string): APIGatewayAuthorizerResult => {
return {
principalId: principalId,
policyDocument: {
Version: "2012-10-17",
Statement: [
{
Action: "execute-api:Invoke",
Effect: effect,
Resource: resource,
},
],
},
};
};
이 예에서는 요청 헤더의 CustomHeader 값을 검사하고, 값이 "some-value"일 경우 해당 요청에 대한 접근을 허용하고, 그렇지 않은 경우 거부합니다.
이렇게 작성한 Authorizer Lambda 함수를 배포하고 serverless.yml 파일에 적용하면, 요청 데이터를 기반으로 한 인증 및 권한 부여가 가능해집니다.
지금 보시는 글은 ChatGPT의 도움을 받아 작성되었습니다.
'ChatGPT > AWS Serverless' 카테고리의 다른 글
[AWS][Cognito] 소개 - 1 (0) | 2023.04.05 |
---|---|
[AWS][LAMBDA][AUTHORIZER] TOKEN-BASED와 REQUEST-BASED 구현하기 - 3 (0) | 2023.04.04 |
[AWS][LAMBDA][AUTHORIZER] Token-based와 Request-based Authorizer 구현하기 - 1 (0) | 2023.04.04 |
[AWS][LAMBDA] 소개 - 3 (0) | 2023.04.04 |
[AWS][LAMBDA] 소개 - 2 (0) | 2023.04.04 |