• express-js
  • javascript
  • tutorial
  • auth
  • authentication
  • jwt
  • identity
  • api

Express.js API 를 JWT 와 Logto 로 보호하기

JSON Web Token (JWT) 과 Logto 를 사용하여 Express.js API 엔드포인트를 보호하는 방법을 배워보세요.

Gao
Gao
Founder

소개

웹 애플리케이션을 개발할 때 API 엔드포인트를 무단 액세스로부터 보호하는 것이 매우 중요합니다. 온라인 쇼핑 웹사이트를 구축하는 상황을 가정해보세요; 사이버 도둑들이 API 를 악용하는 것을 원하지 않을 것입니다.

이미 사용자가 로그인해야 특정 작업을 수행할 수 있는 Express.js 애플리케이션을 구축했다고 가정합니다. 그렇지 않다면 Logto 를 사용하여 몇 줄의 코드만으로 사용자 인증 흐름을 설정할 수 있습니다.

그러나 사용자 인증 후에도 API 엔드포인트를 보호하기 위한 다양한 선택지가 있습니다. 불행히도, 대부분의 옵션에는 단점이 있습니다:

  • 세션 기반 인증: API 를 세션 저장소에 연결하는 것은 확장성이 떨어지며, 마이크로서비스에 적합하지 않습니다.
  • 인증 서비스를 호출하기: 이는 추가 네트워크 호출을 포함하며, 지연 시간과 비용을 증가시킵니다. 일부 인증 서비스는 API 호출 볼륨에 따라 비용을 부과하기도 하여, 높은 비용이 발생할 수 있습니다.

이 튜토리얼에서는 JSON Web Tokens (JWT) 와 Logto 를 사용하여 API 엔드포인트를 강화하는 방법을 시연합니다. 이 방법은 확장성이 뛰어나고 추가 비용이 최소화됩니다.

사전 준비 사항

시작하기 전에 다음이 필요합니다:

  • Logto 계정. 계정이 없다면 무료로 가입할 수 있습니다.
  • API 보호가 필요한 Express.js 프로젝트 및 API 를 사용하는 클라이언트 애플리케이션.
  • JSON Web Token (JWT) 기본 지식.

Logto 에서 API 리소스 정의하기

Logto 는 RFC 8707: OAuth 2.0 을 위한 리소스 인디케이터의 모든 이점을 활용하여 API 엔드포인트를 보호합니다. 즉, 실제 URL 을 사용하여 API 리소스를 정의할 수 있습니다.

Logto 콘솔의 "API 리소스" 탭으로 이동하여 "API 리소스 생성"을 클릭하여 새 항목을 만드세요. 예를 들어, /api/products 엔드포인트를 보호하려면 https://yourdomain.com/api/products 를 식별자로 사용할 수 있습니다.

API 리소스 생성

클라이언트 애플리케이션에서 액세스 토큰 얻기

다음 단계로 진행하려면 클라이언트 애플리케이션에 Logto SDK 를 통합해야 합니다. 이 애플리케이션은 Express.js 백엔드와 다를 수 있습니다; 예를 들어, React 앱이 Express.js 를 백엔드 API 서버로 사용할 수 있습니다.

이 보조금에서 API 에 대한 액세스 토큰을 요청하려면 Logto SDK 설정을 변경해야 합니다. React 를 사용하는 예는 다음과 같습니다:

사용자가 Logto 를 통해 로그인하면, Logto SDK 내의 isAuthenticatedtrue 로 변경됩니다:

이제 getAccessToken 메서드를 사용하여 API 에 대한 액세스 토큰을 가져올 수 있습니다:

마지막으로, API 에 요청할 때 이 액세스 토큰을 Authorization 헤더에 포함하세요:

API 에서 액세스 토큰 검증하기

Express.js 애플리케이션에서 JWT 검증을 위해 jose 라이브러리를 설치하세요:

Bearer 인증을 사용하고 있으므로, Authorization 헤더에서 액세스 토큰을 추출하세요:

그 후, 액세스 토큰을 검증하는 미들웨어를 생성하세요:

이제 이 미들웨어를 사용하여 API 엔드포인트를 보호할 수 있습니다:

이 방법으로, 요청이 도착할 때마다 Logto 서버에 연락할 필요가 없습니다. 대신, Logto 서버에서 한 번 JSON Web Key Set (JWKS) 를 가져와 로컬에서 액세스 토큰을 검증합니다.

역할 기반 액세스 제어

지금까지 우리는 Logto 를 통해 사용자가 로그인했는지 여부만 확인했습니다. 사용자가 API 엔드포인트에 액세스할 적절한 권한이 있는지는 아직 알 수 없습니다. 이는 Logto 가 모든 사람에게 기존 API 리소스에 대한 액세스 토큰을 얻도록 허용하기 때문입니다.

이를 해결하기 위해 역할 기반 액세스 제어 (RBAC)를 사용할 수 있습니다. Logto 에서 역할을 정의하고 권한을 할당할 수 있습니다. Logto 에서 역할과 권한을 정의하는 방법에 대한 이 튜토리얼을 참조하세요.

역할과 권한을 정의한 후, LogtoProvider 구성 요소에 scopes 옵션을 추가할 수 있습니다:

그런 다음 Logto 는 적절한 범위로서만 사용자가 액세스 토큰을 발급하도록 합니다. 예를 들어, 사용자가 read:products 범위만 가지고 있다면, 액세스 토큰은 해당 범위만 포함합니다:

만약 사용자가 read:productswrite:products 범위를 모두 가지고 있다면, 액세스 토큰은 공백을 구분자로 사용하여 두 가지 범위를 모두 포함합니다:

Express.js 애플리케이션에서 API 엔드포인트에 액세스하기 전에 액세스 토큰에 올바른 범위가 포함되어 있는지 확인할 수 있습니다:

결론

API 엔드포인트를 보호하면서 확장성을 보장하는 것은 작은 일이 아닙니다. Logto 에서는 개발자가 비즈니스 로직에 더 집중할 수 있도록 요청 인증을 간소화하려고 노력합니다.

궁금한 점이 있으면 언제든지 우리의 Discord 서버에서 질문하세요. 우리의 커뮤니티는 항상 여러분을 도울 준비가 되어 있습니다.