티스토리 뷰

728x90
반응형

서론

Amazon Cognito는 웹 및 모바일 앱에 대한 인증, 권한 부여 및 사용자 관리를 제공한다. 사용자는 UserID와  Password를 사용하여 직접 로그인하거나 Facebook, Amazon, Google 또는 Apple 같은 타사를 통해 로그인할 수 있다. Amazon Cognito의 두 가지 주요 구성 요소는 사용자 풀과 자격 증명 풀이다.

- 사용자 풀 : 앱 사용자의 가입 및 로그인 옵션을 제공하는 사용자 디렉터리

- 자격 증명 풀 : AWS 서비스에 대한 사용자 액세스 권한 부여

지금부터 Cognito를 연계하는 사용자 인증 및 API 권한 부여 방식에 대해 알아보자.


Amazon Cognito 구성

1) Amazon Cognito 구성

2) Cognito User를 이용한 권한 부여

3) Authorization & JWT 토큰 발급

4) API Gateway 구성

5) API Gateway Cognito 인증 설정

6) API Test


Amazon Cognito 구성

 

 

먼저 Amazon Cognito 사용자 풀을 생성한다.

1) 사용자 풀 관리

 

 

NRSON-OIDC-USER-POOL이라는 사용자 풀을 생성한다. 사용자 풀은 기본값 검토로 생성하며, 다음과 같이 기본 값을 수정하도록 한다.

a. 일반 설정 > 앱 클라이언트

 

 

위와 같이 앱 클라이언트 메뉴에서 앱 클라이언트 이름(nrsonapiclient)을 등록하고 앱 클라이언트 생성을 클릭한다. (클라이언트 보안키 생성을 활성화 한다.)

 

 

앱 클라이언트가 등록되면 위와 같이 앱 클라이언트 ID와 앱 클라이언트 보안키를 확인할 수 있다.

b. 앱 통합 > 도메인 이름

 

 

Amazon Cognito에서 사용자 인증/인가에 사용할 URL(https://nrson-api.auth.ap-northeast-2.amazoncognito.com) 검증을 진행한 후 변경 내용을 저장한다.

c. 앱 통합 > 리소스 서버

 

 

리소스 서버는 nrson-api/data.select, nrson-api/data.insert, nrson-api/data.update, nrson-api/data.delete 형태로 API Scope을 정의할 수 있다. Scope은 API 승인 및 허용된 OAuth 범위 지정에 매핑되어 API 접근 권한을 부여한다. 이는 사용자 풀의 앱 클라이언트 설정에 허용된 Scope을 통해 API 접근 권한이 관리된다.

d. 앱 통합 > 앱 클라이언트 설정

앞서 생성한 앱 클라이언트를 구성한다.

 

 

Cognito User Pool을 활성화한다. 콜백 URL은 localhost로 하되 이후 클라이언트 개발이 완료되면 해당 도메인이 Callback URL이 된다.

권한을 부여할 Scope을 지정하며, 기본 OAuth Scope으로 phone, email, openid, aws.cognito.signin.user.admin, profile이 있으며, 허용된 사용자 지정 범위는 실제 API에 대한 매핑 정보를 선택한다. 예를 들어 해당 앱 클라이언트 ID, 보안키를 사용하는 앱 클라이언트는 nrson-api/data.update, nrson-api/data.select에 대한 Scope을 허용하고, nrson-api/data.insert, nrson-api/data.delete는 허용하지 않는다.


Cognito User를 이용한 권한 부여

Cognito에 인증을 요청할 사용자를 등록하고 사용자 정보를 사용자 풀의 사용자 및 그룹에 등록한다.

 

 

현재는 테스트 용도로 직접 사용자를 위와 같이 등록하지만, 실제로는 사용자 가입 등이 이루어 질때 Cognito의 Admin API를 호출하여 직접 사용자를 등록하는 로직까지 포함되어 동작하도록 개발해야 한다.


Authorization & JWT 토큰 발급

사용자 등록이 완료되면, 로그인을 통해 사용자 Authorization Code를 발급받는다.

다음과 같은 형태로 조회할 수 있다.

Domain Name Server URL + /oauth2/authorize?response_type=code&client_id=<client ID from App client configuration>&redirect_uri=https://localhost/callback&identity_provider=COGNITO&scope=openid+profile+nrson-api/data.select+nrson-api/data.update

이를 url로 변형해 보자면 다음과 같다.

https://nrson-api.auth.ap-northeast-2.amazoncognito.com/oauth2/authorize?response_type=code&client_id=5n9bgthhqevlj9tgbf00pqko8v&redirect_uri=https://localhost/callback&identity_provider=COGNITO&scope=openid+profile+phone+email+nrson-api/data.select+nrson-api/data.update

위와 같이 호출하면, Cognito에 등록된 사용자 정보를 기반으로 로그인 인증을 수행한다.

 

 

실제 애플리케이션에서는 Cognito Admin API를 이용하여 로그인을 인증하기 위한 ID/PW를 함께 전송하도록 개발해야 한다.

 

 

인증에 성공할 경우 위와 같이 callback url에 code="Authorization Code"(01515be2-e9ec-47df-9c92-3a55bc0d1104)를 받을 수 있다. 현재는 localhost에 callback을 구현했지만, 실제는 Client App의 URL로 Callback을 등록해야 한다.

리턴받은 Authorization Code를 기반으로 Cognito Token을 발급 받을 수 있다.

curl -X POST --user 'client_id:client_secret' -H 'Content-Type: application/x-www-form-urlencoded' "https://api-product-test1.auth.us-east-1.amazoncognito.com/oauth2/token?grant_type=authorization_code&client_id=<client_id>&scope=openid+profile&redirect_uri=https://localhost/callback&code=<authorization_code>"

위와 같은 형태로 Cognito Token을 발급 받을 수 있으며, 실제 URL은 다음과 같이 조합할 수 있다.

curl -X POST --user '5n9bgthhqevlj9tgbf00pqko8v:rumunvqes7tjrp010s30kjjsgd9648272h9tvi0pos624coq52q' -H 'Content-Type: application/x-www-form-urlencoded' "https://nrson-api.auth.ap-northeast-2.amazoncognito.com/oauth2/token?grant_type=authorization_code&client_id=5n9bgthhqevlj9tgbf00pqko8v&scope=openid+profile+phone+email&redirect_uri=https://localhost/callback&code=60344767-5a70-4767-947e-9e44926afe5b"

해당 authorization_code가 허용되는 code라면 다음과 같은 Return 값을 받을 것이다.

[root@ip-192-168-114-198 apigateway_test]# curl -X POST --user '5n9bgthhqevlj9tgbf00pqko8v:rumunvqes7tjrp010s30kjjsgd9648272h9tvi0pos624coq52q' -H 'Content-Type: application/x-www-form-urlencoded' "https://nrson-api.auth.ap-northeast-2.amazoncognito.com/oauth2/token?grant_type=authorization_code&client_id=5n9bgthhqevlj9tgbf00pqko8v&scope=openid+profile+phone+email&redirect_uri=https://localhost/callback&code=60344767-5a70-4767-947e-9e44926afe5b"
{
"id_token":"eyJraWQiOiJMQzhTbG9waXNxMzYwb3hcL0FwbHVYdE9XQmVqc1BOazZVdEhFZXo2bmt2ND0iLCJhbGciOiJSUzI1NiJ9.eyJhdF9oYXNoIjoiOHRiWGhoakRrMEJ2VGdxVTB5eTROUSIsInN1YiI6IjRkOTJjMjgyLWY2NmYtNGUwYy1iNTY3LTU5ZDBjODhjY2M3NCIsImF1ZCI6IjVuOWJndGhocWV2bGo5dGdiZjAwcHFrbzh2IiwidG9rZW5fdXNlIjoiaWQiLCJhdXRoX3RpbWUiOjE2MDU1NDI1MTUsImlzcyI6Imh0dHBzOlwvXC9jb2duaXRvLWlkcC5hcC1ub3J0aGVhc3QtMi5hbWF6b25hd3MuY29tXC9hcC1ub3J0aGVhc3QtMl9tTjcwUkdZejUiLCJjb2duaXRvOnVzZXJuYW1lIjoibnJzb24iLCJwaG9uZV9udW1iZXIiOiIrODIxMDEyMzEyMzQiLCJleHAiOjE2MDU1NDYxMTUsImlhdCI6MTYwNTU0MjUxNSwiZW1haWwiOiJzb24ubmFyYUBsZ2Nucy5jb20ifQ.tv0XU6b7mAtRkKdJx4vHpxVWfp90-D-YPpLBXq5hT9nsJV1Eb2ol0xuRdJWsTr6DVOE6XWMd8RllkiFeS0MML009P-yGCaT0PYTOSg0Pklr20Qn6-jYzkxHPK58hfxQ_TxO3Ido7Lz5VxAoHF0j0FEO672BKdQOKJA129QD3hbVnaw9PDa41oipuk_Rjg5NH7qnUSJwAC7CLnjJN6cwA8aHoT4Zt9zSyDEy-2r2VoB052ZVoKQzJwVv28cyaqYupNxbdl-JWLx14sfvbeO_UBjabAdmtJI16G_iARX0ozHWkOYiuUw18eJV6oyyLvHGlA8uvc3zGKOsU7Mwxymljyg",
"access_token":"eyJraWQiOiJWR3lWcUdTajZ3ZU4zUGU2SzBSTHFxOGdWQkZUenppVXhWVDVoSkZHTlBrPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI0ZDkyYzI4Mi1mNjZmLTRlMGMtYjU2Ny01OWQwYzg4Y2NjNzQiLCJ0b2tlbl91c2UiOiJhY2Nlc3MiLCJzY29wZSI6Im5yc29uLWFwaVwvZGF0YS51cGRhdGUgcGhvbmUgbnJzb24tYXBpXC9kYXRhLnNlbGVjdCBvcGVuaWQgcHJvZmlsZSBlbWFpbCIsImF1dGhfdGltZSI6MTYwNTU0MjUxNSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLmFwLW5vcnRoZWFzdC0yLmFtYXpvbmF3cy5jb21cL2FwLW5vcnRoZWFzdC0yX21ONzBSR1l6NSIsImV4cCI6MTYwNTU0NjExNSwiaWF0IjoxNjA1NTQyNTE1LCJ2ZXJzaW9uIjoyLCJqdGkiOiI5ODQ1ZTViNS1hMWNjLTRhZmYtOTIyZi0wYmE5MjBjYTk5YjIiLCJjbGllbnRfaWQiOiI1bjliZ3RoaHFldmxqOXRnYmYwMHBxa284diIsInVzZXJuYW1lIjoibnJzb24ifQ.FPmI6I8NIN5O6DN1UA5U9L1VxMaXxDHlQ5zg5AYq6GCYaRh99zOAUGjZVjsv-Th5ogxTX7UUKAdtsEM7aHNluQT-xAuJ243LfCRcVfYNW8bnOgIejEe4XMj6wiE80ks0BrRX8u9THwvbzN62mLavmeLXvn4su2-MLZXM-ZMPDAbTx9iQqqYK03muRd_gltem_bSmG4dP7WNksi-N-I0A9mSqQgEqhf4vrg-fRFD9BchzY0u54zLWKq1RovynfR9G89gj_Uodu5SkxBDX1_86m0y6o0a8htijN4neUE04Y-05sJ260lS9O7C2wU5yyTBIW4jGfYHdNZQXG5tNKn5ejw",
"refresh_token":"eyJjdHkiOiJKV1QiLCJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.ZNuN4aKm1fdjVI77rKkWzORJzIPyS5tJkD8e_u_t-2SHfPJE02O8cvh8YThvLBxXllNyeAvyw5WxuuQHCh19Suj2iN-MPyalvveJetCfWC36nvkgu_X96HY4-oyFFik-PMYcpdUqyiaTR4q3IzK4wsRmDgxuYzJh6GsLeHr8I5ne8D7Qt0C5APthDC5iyPUCCP8PyIX6g15OilxlJ33urm0QGCHTT2xcb4PIOh4RbJDnkR3B_eg166uF7Av5BeyqXDtbPp0MCQR8v8H6RZeSCIfXR8PCM24zvSDDgwULVytj3OYIlcBoiWx2Pj_6uugooqzY1ROH7uR1wmI80CB_9Q.Zzvuc7EvuWwzGjiH.2Mh6zKMOByc6doYVRDzUr1mJRIcNpq55GWeY9qJo23R7hiYvYGgOtL83zfrzFKkGsHHFZ3NhNA43ptaUxCmIJxlm_RQUrVFmca1TFkBE2CW3Uy4zq1HHVXF1W9RL_VCVtJAOhOkh_nYwtjc3MhP-r3pXGMWnGxdYIwBdLIAzTF3rZ8Ggje2QcqV4ohkalFI3EwGaEnXBg-NjUaGBNWzeLqZtH06B6ntWVCEyyhVK4_XD178C8CHHs5WJEN-4g8S5AQ8ct-wXd9C2Zm1IVGFTt9b-NE9rlnltclvSCRNK03bjTd82q7DwoCXzBAgCVojG4tZKfJxZi4SsmLhbN8WssPznpjMJcLo8roYbKux9HA1rIcH0ySPGJflLrNjQuOzsZIi9YxdGsBE5VYr5EVe1gl7fi_nIH5ilOWUYIURsmbd9lNNAQYzpDOanJKEBdMcOx-y_LZBql0xnvcM9c2sBeQIF-E9WVJmLzdRSb3YzodMZmpq3AlwW05Kds7r3zc_mg39fF24PaFARDdlHejsVZZp8rffwbqJqrIiCde7r2_3aWjxA-k4VdnNsJNpkVbpqJtt7bn2PE-AdrLKCi_rvaKBz4IQ0tRIrHAMSCT9MxxREhNKX_x2jCM_ld-TKeHs3OQKtkHY66-j6RUHV-6WLO7uK0At9yo54N-AATM2M4H2RI-Jb6hJ8VLgfGcbD-yTEpaCfI8Qml0Yo9A9_ow4v03jcCaIVNqPwFSz8PCGyzRuyfd2lKqEFHCxh0Y_E2Kr5dGbyw2HOPDEa-NoiQmV3mKUemw2mrkRQH9d0FNSXUjD3j7z3LDfhmDr4gto6Xzm9E6MvYMjfCYy71bSxNvk71BKWQj_DN9GvvnjRUzX4sIMKUfvnOjz-j5Nr2JetvrjCkiTHtoUE2Y1UkH4Uot_Cl4h46IJUY0EGlnS2PoHMV4Spt7OpI2m6Ewyzhiy8eRboL4xqpjl7iGQKxnzzKAs2AIbigxc2l5sBIw-lFa-z5kn6TAwB-FVojSpcbI4FLHXa7baYj8p_60heK75z8UTt00atYQnsCAF42vmc0zLBbXDh_iJcpLMOQTIw-NzKHiT-qi7T4MZgxMr5UVGikL8S8FXgEwvPUQc0iXq0InUbZ648cr4lRALp_kKbpn8OYxqIijcjydThwxadZ12QOCV6LVbW_IP-nldg--LuqIo5suSVlloSfbB9nQ8zi_kDsoOUmXk4puqJH_GYlwFYh1WxUVjqlquAeSXlFAGVXtPEYuiJ6cpF6bdRXdkXE53cLEGyvdwtOs2bUnTPWkxMfFGc9gBlr7ZPMOISOw.QeTQla1_NjUkGbq_meoUCw",
"expires_in":3600,
"token_type":"Bearer"
}
[root@ip-192-168-114-198 apigateway_test]#

id_token은 사용자 인증을 위해 사용된다. 특히 마이크로서비스 아키텍처에서 분산된 서비스 간 사용자 인증 용도로 활용될 수 있다.

access_token은 API 권한 부여 용도로 사용된다. 해당 access_token을 사용하여 API Gateway를 통한 Cognito 인가 검증을 통해 앱 클라이언트 별로 허용된 Scope을 확인하고 API 권한을 검증할 수 있다.

refresh_token은 사용자 인증, 인가 등을 갱신하는 용도로 사용할 수 있다.

리턴 받은 id_token과 access_token 정보를 다음에서 확인해 보도록 하자.

[id_token]

 

 

위와 같이 id_token에는 사용자 정보를 포함하고 있다.

[access_token]

 

 

위와 같이 access_token에는 scope 정보와 client_id, username이 저장되어 있어 API 권한 부여를 위한 인가를 진행할 수 있다.


API Gateway 구성

다음으로 앞서 생성한 API Scope을 API에 적용해 보도록 하자.

적용 테스트를 진행하기 위해 다음과 같이 GET/POST/PUT/DELETE 메소드를 포함하는 /api/author/{authorid} API를 먼저 구성한다.

 

 

위 HTTP Method는 각각 다음과 같은 값을 리턴한다.

[root@ip-192-168-114-198 apigateway_test]# curl -X GET https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{
    "authors": [
        {
            "author": "Peter Sbarski",
            "id": "Peter-Sbarski",
            "books": "9781617293825",
            "about": ""
        },
        {
            "author": "Ed Robinson",
            "id": "Ed-Robinson",
            "books": "9781788390071",
            "about": "Ed Robinson works as a senior site reliability engineer at Cookpad's global headquarters in Bristol, UK. He has been working with Kubernetes for the last three years, deploying clusters on AWS to deliver resilient and reliable services for global audiences. He is a contributor to several open source projects and is a maintainer of Traefik, the modern HTTP reverse proxy designed for containers and microservices."
        },
        {
            "author": "Gabriel Ramirez",
            id": "Gabriel-Ramirez",
            "books": "9781617293825",
            "about": "Gabriel Ramirez was born in Mexico City where he studied Systems Engineering, he has 14 years of experience in the tech industry and has a wide experience in software development and enterprise systems architecture; he achieved the Oracle Certified Master Enterprise Architect certification"
        },
        {
            "author": "Markus Klems",
            "id": "Markus-Klems",
            "books": "9781789130669",
            "about": ""
        },
        {
            "author": "Mitesh Soni",
            "id": "Mitesh-Soni",
            "books": "9781789535549",
            "about": "Mitesh Soni is an avid learner with 10 years' experience in the IT industry. He is a Certified ScrumMaster (CSM), Certified Jenkins Engineer (CJE), SCJP, SCWCD, VCP, IBM Urbancode, and IBM Bluemix certified professional."
        },
        {
            "author": "Yogesh Raheja",
            "id": "Yogesh-Raheja",
            "books": "9781789539974",
            "about": "Yogesh Raheja is a certified DevOps and cloud expert with a decade of IT experience. He has expertise in technologies such as OS, source code management, build & release tools, continuous"
        },
        {
            "author": "Mohit Gupta",
            "id": "Mohit-Gupta",
            "books": "9781789805024",
            "about": ""
        },
        {
            "author": "John Paul Mueller",
            "id": "John-Paul-Mueller",
            "books": "9781119371847",
            "about": ""
        },
        {
            "author": "Mitch Garnaat",
            "id": "Mitch-Garnaat",
            "books": "9781449305444",
            "about": ""
        },
        {
            "author": "David K. Rensin",
            "id": "David-K.-Rensin",
            "books": "9781449333584",
            "about": "David K. Rensin (1972-) is an American technology entrepreneur, computer scientist, and best-selling author based in Silicon Valley (just south of San Francisco, CA). He writes on a wide range of technical topics from advanced data management to best practices for building distributed systems and companies."
        }
    ]
}
[root@ip-192-168-114-198 apigateway_test]#curl -X POST https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{
    "returnCode" : 200,
    "message" : "Success INSERT Data"
}
[root@ip-192-168-114-198 apigateway_test]# curl -X PUT https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{
    "returnCode" : 200,
    "message" : "Success UPDATE Data"
}
[root@ip-192-168-114-198 apigateway_test]# curl -X DELETE https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{
    "returnCode" : 200,
    "message" : "Success DELETE Data"
}
[root@ip-192-168-114-198 apigateway_test]# 

API 구성이 완료되면 권한 부여자를 생성한다.

 

 

위와 같이 권한 부여자를 Cognito 유형으로 생성하며, 앞서 생성한 Cognito 사용자 풀을 선택하여 권한 부여자를 지정한다. 토큰 원본으로 Authorization을 등록한 후 생성 버튼을 클릭한다.

다음으로 API Method에 권한 부여자 및 등록 및 허용된 OAuth 범위를 지정한다.

 

 

각각의 API HTTP Method는 Cognito에 정의한 사용자 풀을 권한 부여자로 등록하고 리소스 Scope을 API 별로 등록하여 해당 api를 사용할 수 있는지 여부를 검증하도록 설계한다.


API Test

위와 같이 등록이 완료된 이후 다시한번 API를 배포하고 호출해 보자.

[root@ip-192-168-114-198 apigateway_test]# curl -X GET https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{"message":"Unauthorized"}[root@ip-192-168-114-198 apigateway_test]# 
[root@ip-192-168-114-198 apigateway_test]# curl -X POST https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{"message":"Unauthorized"}[root@ip-192-168-114-198 apigateway_test]# 
[root@ip-192-168-114-198 apigateway_test]# curl -X PUT https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{"message":"Unauthorized"}[root@ip-192-168-114-198 apigateway_test]# 
[root@ip-192-168-114-198 apigateway_test]# curl -X DELETE https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{"message":"Unauthorized"}[root@ip-192-168-114-198 apigateway_test]# 
[root@ip-192-168-114-198 apigateway_test]#

위와 같이 모든 호출에 대해 Unauthorized로 접근 권한이 차단된 상태이다.

이제 access_token을 추가하여 API를 호출해 보도록 하자.

[root@ip-192-168-114-198 apigateway_test]# curl -X GET -H 'Authorization :  eyJraWQiOiJWR3lWcUdTajZ3ZU4zUGU2SzBSTHFxOGdWQkZUenppVXhWVDVoSkZHTlBrPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI0ZDkyYzI4Mi1mNjZmLTRlMGMtYjU2Ny01OWQwYzg4Y2NjNzQiLCJ0b2tlbl91c2UiOiJhY2Nlc3MiLCJzY29wZSI6Im5yc29uLWFwaVwvZGF0YS51cGRhdGUgcGhvbmUgbnJzb24tYXBpXC9kYXRhLnNlbGVjdCBvcGVuaWQgcHJvZmlsZSBlbWFpbCIsImF1dGhfdGltZSI6MTYwNTU0MjUxNSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLmFwLW5vcnRoZWFzdC0yLmFtYXpvbmF3cy5jb21cL2FwLW5vcnRoZWFzdC0yX21ONzBSR1l6NSIsImV4cCI6MTYwNTU0NjExNSwiaWF0IjoxNjA1NTQyNTE1LCJ2ZXJzaW9uIjoyLCJqdGkiOiI5ODQ1ZTViNS1hMWNjLTRhZmYtOTIyZi0wYmE5MjBjYTk5YjIiLCJjbGllbnRfaWQiOiI1bjliZ3RoaHFldmxqOXRnYmYwMHBxa284diIsInVzZXJuYW1lIjoibnJzb24ifQ.FPmI6I8NIN5O6DN1UA5U9L1VxMaXxDHlQ5zg5AYq6GCYaRh99zOAUGjZVjsv-Th5ogxTX7UUKAdtsEM7aHNluQT-xAuJ243LfCRcVfYNW8bnOgIejEe4XMj6wiE80ks0BrRX8u9THwvbzN62mLavmeLXvn4su2-MLZXM-ZMPDAbTx9iQqqYK03muRd_gltem_bSmG4dP7WNksi-N-I0A9mSqQgEqhf4vrg-fRFD9BchzY0u54zLWKq1RovynfR9G89gj_Uodu5SkxBDX1_86m0y6o0a8htijN4neUE04Y-05sJ260lS9O7C2wU5yyTBIW4jGfYHdNZQXG5tNKn5ejw' https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{
    "authors": [
        {
            "author": "Peter Sbarski",
            "id": "Peter-Sbarski",
            "books": "9781617293825",
            "about": ""
        },
        {
            "author": "Ed Robinson",
            "id": "Ed-Robinson",
            "books": "9781788390071",
            "about": "Ed Robinson works as a senior site reliability engineer at Cookpad's global headquarters in Bristol, UK. He has been working with Kubernetes for the last three years, deploying clusters on AWS to deliver resilient and reliable services for global audiences. He is a contributor to several open source projects and is a maintainer of Traefik, the modern HTTP reverse proxy designed for containers and microservices."
        },
        {
            "author": "Gabriel Ramirez",
            id": "Gabriel-Ramirez",
            "books": "9781617293825",
            "about": "Gabriel Ramirez was born in Mexico City where he studied Systems Engineering, he has 14 years of experience in the tech industry and has a wide experience in software development and enterprise systems architecture; he achieved the Oracle Certified Master Enterprise Architect certification"
        },
        {
            "author": "Markus Klems",
            "id": "Markus-Klems",
            "books": "9781789130669",
            "about": ""
        },
        {
            "author": "Mitesh Soni",
            "id": "Mitesh-Soni",
            "books": "9781789535549",
            "about": "Mitesh Soni is an avid learner with 10 years' experience in the IT industry. He is a Certified ScrumMaster (CSM), Certified Jenkins Engineer (CJE), SCJP, SCWCD, VCP, IBM Urbancode, and IBM Bluemix certified professional."
        },
        {
            "author": "Yogesh Raheja",
            "id": "Yogesh-Raheja",
            "books": "9781789539974",
            "about": "Yogesh Raheja is a certified DevOps and cloud expert with a decade of IT experience. He has expertise in technologies such as OS, source code management, build & release tools, continuous"
        },
        {
            "author": "Mohit Gupta",
            "id": "Mohit-Gupta",
            "books": "9781789805024",
            "about": ""
        },
        {
            "author": "John Paul Mueller",
            "id": "John-Paul-Mueller",
            "books": "9781119371847",
            "about": ""
        },
        {
            "author": "Mitch Garnaat",
            "id": "Mitch-Garnaat",
            "books": "9781449305444",
            "about": ""
        },
        {
            "author": "David K. Rensin",
            "id": "David-K.-Rensin",
            "books": "9781449333584",
            "about": "David K. Rensin (1972-) is an American technology entrepreneur, computer scientist, and best-selling author based in Silicon Valley (just south of San Francisco, CA). He writes on a wide range of technical topics from advanced data management to best practices for building distributed systems and companies."
        }
    ]
}[root@ip-192-168-114-198 apigateway_test]# 
[root@ip-192-168-114-198 apigateway_test]# curl -X POST -H 'Authorization :  eyJraWQiOiJWR3lWcUdTajZ3ZU4zUGU2SzBSTHFxOGdWQkZUenppVXhWVDVoSkZHTlBrPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI0ZDkyYzI4Mi1mNjZmLTRlMGMtYjU2Ny01OWQwYzg4Y2NjNzQiLCJ0b2tlbl91c2UiOiJhY2Nlc3MiLCJzY29wZSI6Im5yc29uLWFwaVwvZGF0YS51cGRhdGUgcGhvbmUgbnJzb24tYXBpXC9kYXRhLnNlbGVjdCBvcGVuaWQgcHJvZmlsZSBlbWFpbCIsImF1dGhfdGltZSI6MTYwNTU0MjUxNSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLmFwLW5vcnRoZWFzdC0yLmFtYXpvbmF3cy5jb21cL2FwLW5vcnRoZWFzdC0yX21ONzBSR1l6NSIsImV4cCI6MTYwNTU0NjExNSwiaWF0IjoxNjA1NTQyNTE1LCJ2ZXJzaW9uIjoyLCJqdGkiOiI5ODQ1ZTViNS1hMWNjLTRhZmYtOTIyZi0wYmE5MjBjYTk5YjIiLCJjbGllbnRfaWQiOiI1bjliZ3RoaHFldmxqOXRnYmYwMHBxa284diIsInVzZXJuYW1lIjoibnJzb24ifQ.FPmI6I8NIN5O6DN1UA5U9L1VxMaXxDHlQ5zg5AYq6GCYaRh99zOAUGjZVjsv-Th5ogxTX7UUKAdtsEM7aHNluQT-xAuJ243LfCRcVfYNW8bnOgIejEe4XMj6wiE80ks0BrRX8u9THwvbzN62mLavmeLXvn4su2-MLZXM-ZMPDAbTx9iQqqYK03muRd_gltem_bSmG4dP7WNksi-N-I0A9mSqQgEqhf4vrg-fRFD9BchzY0u54zLWKq1RovynfR9G89gj_Uodu5SkxBDX1_86m0y6o0a8htijN4neUE04Y-05sJ260lS9O7C2wU5yyTBIW4jGfYHdNZQXG5tNKn5ejw' https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{"message":"Unauthorized"}[root@ip-192-168-114-198 apigateway_test]# 
[root@ip-192-168-114-198 apigateway_test]# curl -X PUT -H 'Authorization :  eyJraWQiOiJWR3lWcUdTajZ3ZU4zUGU2SzBSTHFxOGdWQkZUenppVXhWVDVoSkZHTlBrPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI0ZDkyYzI4Mi1mNjZmLTRlMGMtYjU2Ny01OWQwYzg4Y2NjNzQiLCJ0b2tlbl91c2UiOiJhY2Nlc3MiLCJzY29wZSI6Im5yc29uLWFwaVwvZGF0YS51cGRhdGUgcGhvbmUgbnJzb24tYXBpXC9kYXRhLnNlbGVjdCBvcGVuaWQgcHJvZmlsZSBlbWFpbCIsImF1dGhfdGltZSI6MTYwNTU0MjUxNSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLmFwLW5vcnRoZWFzdC0yLmFtYXpvbmF3cy5jb21cL2FwLW5vcnRoZWFzdC0yX21ONzBSR1l6NSIsImV4cCI6MTYwNTU0NjExNSwiaWF0IjoxNjA1NTQyNTE1LCJ2ZXJzaW9uIjoyLCJqdGkiOiI5ODQ1ZTViNS1hMWNjLTRhZmYtOTIyZi0wYmE5MjBjYTk5YjIiLCJjbGllbnRfaWQiOiI1bjliZ3RoaHFldmxqOXRnYmYwMHBxa284diIsInVzZXJuYW1lIjoibnJzb24ifQ.FPmI6I8NIN5O6DN1UA5U9L1VxMaXxDHlQ5zg5AYq6GCYaRh99zOAUGjZVjsv-Th5ogxTX7UUKAdtsEM7aHNluQT-xAuJ243LfCRcVfYNW8bnOgIejEe4XMj6wiE80ks0BrRX8u9THwvbzN62mLavmeLXvn4su2-MLZXM-ZMPDAbTx9iQqqYK03muRd_gltem_bSmG4dP7WNksi-N-I0A9mSqQgEqhf4vrg-fRFD9BchzY0u54zLWKq1RovynfR9G89gj_Uodu5SkxBDX1_86m0y6o0a8htijN4neUE04Y-05sJ260lS9O7C2wU5yyTBIW4jGfYHdNZQXG5tNKn5ejw' https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{
    "returnCode" : 200,
    "message" : "Success UPDATE Data"
}[root@ip-192-168-114-198 apigateway_test]# 
[root@ip-192-168-114-198 apigateway_test]# curl -X DELETE -H 'Authorization :  eyJraWQiOiJWR3lWcUdTajZ3ZU4zUGU2SzBSTHFxOGdWQkZUenppVXhWVDVoSkZHTlBrPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiI0ZDkyYzI4Mi1mNjZmLTRlMGMtYjU2Ny01OWQwYzg4Y2NjNzQiLCJ0b2tlbl91c2UiOiJhY2Nlc3MiLCJzY29wZSI6Im5yc29uLWFwaVwvZGF0YS51cGRhdGUgcGhvbmUgbnJzb24tYXBpXC9kYXRhLnNlbGVjdCBvcGVuaWQgcHJvZmlsZSBlbWFpbCIsImF1dGhfdGltZSI6MTYwNTU0MjUxNSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLmFwLW5vcnRoZWFzdC0yLmFtYXpvbmF3cy5jb21cL2FwLW5vcnRoZWFzdC0yX21ONzBSR1l6NSIsImV4cCI6MTYwNTU0NjExNSwiaWF0IjoxNjA1NTQyNTE1LCJ2ZXJzaW9uIjoyLCJqdGkiOiI5ODQ1ZTViNS1hMWNjLTRhZmYtOTIyZi0wYmE5MjBjYTk5YjIiLCJjbGllbnRfaWQiOiI1bjliZ3RoaHFldmxqOXRnYmYwMHBxa284diIsInVzZXJuYW1lIjoibnJzb24ifQ.FPmI6I8NIN5O6DN1UA5U9L1VxMaXxDHlQ5zg5AYq6GCYaRh99zOAUGjZVjsv-Th5ogxTX7UUKAdtsEM7aHNluQT-xAuJ243LfCRcVfYNW8bnOgIejEe4XMj6wiE80ks0BrRX8u9THwvbzN62mLavmeLXvn4su2-MLZXM-ZMPDAbTx9iQqqYK03muRd_gltem_bSmG4dP7WNksi-N-I0A9mSqQgEqhf4vrg-fRFD9BchzY0u54zLWKq1RovynfR9G89gj_Uodu5SkxBDX1_86m0y6o0a8htijN4neUE04Y-05sJ260lS9O7C2wU5yyTBIW4jGfYHdNZQXG5tNKn5ejw' https://7iapv0snbg.execute-api.ap-northeast-2.amazonaws.com/api/author/list
{"message":"Unauthorized"}[root@ip-192-168-114-198 apigateway_test]# 
[root@ip-192-168-114-198 apigateway_test]#

위와 같이 access_token을 포함하여 호출할 경우 리소스 서버에 등록된 Scope과 매칭된 API 중 앱 클라이언트 설정에서 허용한 API(앞서 앱 클라이언트 설정에서 nrson-api/data.select, nrson-api/data.update 허용 체크)만 정상적으로 호출이 되고 나머지 api는 허용이 차단된 것을 확인할 수 있다.


결론

IDP 표준으로는 SAMP, OAuth, OIDC 등이 있으며, 많이 사용되는 OAuth는 서버 to 서버 간 인가 처리를 하는 반면 OIDC는 심플한 JSON 형식을 사용하여 OAuth 프로토콜을 기반으로 Authorization은 물론 Client의 인증을 포함하는 방식으로 최근 많이 사용되고 있다.

OAuth 서버가 access_token + refresh_token을 제공하는 것과 다르게 OIDC는 id_token + access_token + refresh_token을 함께 제공한다. 마이크로서비스 환경에서는 id_token을 활용하여 마이크로서비스 간 이동이 발생하여도 사용자 인증을 유지하도록 관리할 수 있으며, access_token은 API 접근 권한을 제공하기 위한 Scope을 정의할 수 있다.

이와 같이 OIDC 인증/인가 방식은 기존 OAuth2 & SAML 인증 방식을 보완한 방식으로 이전 방식의 IDP 표준을 사용하는 프로젝트에서는 OIDC 적용을 고려해 봐야할 것이다. 다만, 각 IDP 별로 상이한 기능을 보유하고 있기에 인증 방식에 대한 명확한 이해로부터 적용을 고려해야 할 것이다.
또한 토큰정보를 언제든 HOOKING 할 수 있기 때문에 어떻게 캡슐레이션하여 관리할 것인지 발급된 토큰의 생명 주기는 어떻게 할 것인지 등 다양한 고려사항을 포함한 인증/인가 체계를 수립해야 한다.

728x90
반응형