⚙️ Backend

JWT 인증토큰, Bearer 토큰에 관하여.. for Node Express.

코너(Corner) 2022. 10. 28.
반응형

JWT 인증토큰, Bearer 토큰에 관하여.. for Node Express.


JWT 란,

JWT(Json Web Token)은 클라이언트와 서버 혹은 서비스 간의 통신시 정보를 JSON 객체를 통해 안전하게 전송하고 권한(Authorization)을 위해 사용하는 토큰입니다.

JWT는 편하게 확인하고 인코딩하도록 도와주는 도구라면, Bearer는 많은 수단 중 하나의 문자열일 뿐입니다.

JWT(Json Web Token)은 정보를 JSON 객체로 안전하게 전송하기 위한 간결한 방법을 제공하는 개방형 표준(RFC 7519)입니다.

 

이 JWT을 언제 사용할까요?

인증 권한 부여(Authorization)  - JWT를 사용하는 가장 일반적 방법인데 사용자가 로그인하고 난 뒤 요청에 JWT가 포함되어 사용자가 해당 토큰으로 허용되는 경로(url, path)에 액세스(예를들면 API 호출 접근 등)할 수 있습니다. 여러 도메인에서 쉽게 사용할 수 있기 때문에 JWT를 널리 사용합니다.

정보 교환(Information Exchange)- JWT는 당사자 간에 정보를 안전하게 전송할 수 있는 좋은 방법입니다. 정보를 안전하고 편하게 확인시켜주는 도구이며, 공개/개인키 쌍을 사용하여 JWT에 서명할 수 있기 때문에 발신자가 누구인지 확인할 수 있습니다. 헤더에 페이로드를 사용하여 서명을 계산하므로 컨텐츠가 변조되지 않았는지 체크하기 때문에 안전성을 제공합니다.

위의 상황에 맞게 보안과 정보 등 어떤 경우에서만 호출하게 할 것인지 .. 등등 개발 설계 방식에는 아주 많고 다양한 방법이 많기 때문에 

이러한 고려를 무조건 하면서, 보안 인증을 어떤식으로 할 것인지 또한 고려하고 개발을 진행해야합니다.

 

JWT 토큰 구조 

- 헤더 (Header) - 토큰 유형 및 토큰을 만드는 데 사용된 알고리즘에 대한 데이터가 여기에 포함됩니다. 

- 페이로드 (Payload) -  권한 및 만료를 포함하여 사용자에 대한 정보가 여기에 포함됩니다.

- 서명 (Signature) -  받는 사람이 토큰의 진위를 확인할 수 있도록 확인 데이터가 여기에 포함됩니다. 이 서명은 일반적으로 해시되어 해킹 및 복제가 어렵습니다.

이것은 액세스 토큰에 포함되어 있습니다.


액세스 토큰은 어떻게 작동하는가.

사용자는 자신의 액세스 코드를 작성하지 않습니다. 서버는 장치와 통신하며 모든 작업은 몇 분 안에 이루어집니다. 

  • 로그인: 사용자 이름과 비밀번호를 사용하여 인증합니다. 
  • 검증: 서버가 데이터를 인증하고 토큰을 발행합니다. 
  • 저장: 토큰은 저장을 위해 브라우저로 전송됩니다. 
  • 통신: 서버의 새로운 항목에 액세스할 때마다 토큰이 다시 한 번 확인됩니다. 
  • 삭제: 세션이 종료되면 토큰이 폐기됩니다. 

SSO(Single Sign-On)에 액세스 토큰을 사용할 수도 있습니다. 한 사이트의 자격 증명이 다른 사이트를 입력하는 키가 됩니다.

  • 승인: 귀하는 한 사이트의 자격 증명을 사용하여 다른 사이트를 입력하는 데 동의합니다. 
  • 연결: 첫 번째 사이트가 두 번째 사이트를 연결하고 도움을 요청합니다. 두 번째 사이트는 액세스 토큰을 생성합니다. 
  • 저장: 액세스 토큰은 브라우저에 저장됩니다. 
  • 항목: 두 번째 사이트의 액세스 토큰으로 첫 번째 사이트에 들어갈 수 있습니다. 

SSO 요청은 빨리 만료됩니다.  대부분 의 요청은 약 10분 이내에 만료되지만 일부 요청은 60초 후에 프로세스를 종료합니다.

 

액세스 토큰은 인터넷의 열린 공간을 이동할 때 보호되어야 합니다. 암호화 또는 보호된 통신 채널을 사용하지 않는 회사는 제3자가 토큰을 획득하도록 허용할 수 있으며 이는 매우 민감한 데이터에 대한 무단 액세스를 의미할 수 있습니다.

대부분의 액세스 토큰도 만료됩니다. 이 간단한 단계를 통해 웹 사이트는 사용자가 여전히 온라인 상태이고 활성 상태인지 확인하고 대규모 복제 또는 삭제를 방지할 수 있습니다. 만료 날짜는 개발할 때마다, 서비스의 규칙마다 다를 수 있습니다. 


토큰 기반 인증이란 무엇인가.

토큰 기반 인증은 사용자가 자신의 신원을 확인하고 그 대가로 고유한  액세스 토큰을 받을 수 있는 프로토콜입니다 . 토큰 수명 동안 사용자는 동일한 웹 페이지, 앱 또는 동일한 토큰으로 보호되는 리소스로 돌아갈 때마다 자격 증명을 다시 입력할 필요 없이 토큰이 발급된 웹 사이트 또는 앱에 액세스합니다. 

인증 토큰은 스탬프 티켓처럼 작동합니다. 사용자는 토큰이 유효한 동안 액세스를 유지합니다. 사용자가 로그아웃하거나 앱을 종료하면 토큰이 무효화됩니다.

토큰 기반 인증은 기존의 암호 기반 또는 서버 기반 인증 기술과 다릅니다. 토큰은 두 번째 보안 계층을 제공하며 관리자는 각 작업과 트랜잭션을 세부적으로 제어할 수 있습니다.

그러나 토큰을 사용하려면 약간의 코딩 노하우가 필요합니다. 대부분의 개발자는 기술을 빠르게 습득하지만 러닝 커브가 있습니다.

토큰이 적합한지 결정할 수 있도록 자세히 살펴보겠습니다. 

 

JWT의 장단점

JWT에는 많은 이점이 있습니다.

  • 크기: 토큰은 작고, 두 객체 간에 매우 빠르게 전달할 수 있습니다.
  • 용이성: 토큰은 거의 모든 곳에서 생성할 수 있으며 서버에서 확인할 필요가 없습니다.
  • 제어: 다른 사람이 액세스할 수 있는 항목, 해당 권한이 지속되는 기간 및 로그온한 동안 수행할 수 있는 작업을 지정할 수 있습니다.

잠재적인 단점도 있습니다.

  • 단일 키: JWT는 단일 키에 의존합니다. 해당 키가 손상되면 전체 시스템이 위험에 노출됩니다.
  • 복잡성: 이러한 토큰은 이해하기 쉽지 않습니다. 개발자가 암호화 서명 알고리즘에 대한 강력한 지식이 없는 경우 실수로 시스템을 위험에 빠뜨릴 수 있습니다.
  • 제한성: 모든 클라이언트에 메시지를 푸시할 수 없으며 서버 측에서 클라이언트를 관리할 수 없습니다.

 

일반적으로 토큰의 요청 헤더의 Authorization 필드에 담아 보내집니다.

Authorization: <type> <credentials>

우리가 궁금해하던 Bearer<type>에 해당합니다.

토큰에는 많은 종류가 있고 서버는 다양한 종류의 토큰을 처리하기 위해 전송받은 type에 따라 토큰을 다르게 처리합니다.


 

반응형

Bearer외의 인증 타입

Basic

사용자 아이디와 암호를 Base64로 인코딩한 값을 토큰으로 사용합니다. (RFC 7617)

Bearer

JWT 혹은 OAuth에 대한 토큰을 사용합니다. (RFC 6750)

Digest

서버에서 난수 데이터 문자열을 클라이언트에 보냅니다. 클라이언트는 사용자 정보와 nonce를 포함하는 해시값을 사용하여 응답합니다. (RFC 7616)

HOBA

전자 서명 기반 인증방식입니다. (RFC 7486)

Mutual

암호를 이용한 클라이언트-서버 상호 인증입니다.

 

Bearer Authentication (무기명 인증)란,

무기명 인증(토큰 인증이라고도 함)은 전달자 토큰이라는 보안 토큰 을 포함하는 HTTP 인증 체계입니다 . "Bearer 인증"이라는 이름은 "이 토큰의 베어러에게 액세스 권한을 부여합니다."로 이해할 수 있습니다. 전달자 토큰은 일반적으로 로그인 요청에 대한 응답으로 서버에서 생성되는 암호 문자열입니다. 클라이언트는 보호된 리소스에 요청할 때 Authorization 헤더에서 이 토큰을 보내야 합니다.

Authorization: Bearer "token hash value"

Bearer 인증 체계는 원래 RFC 6750에서 OAuth 2.0의 일부로 생성되었지만 때때로 자체적으로 사용되기도 합니다. 기본 인증과 마찬가지로 Bearer 인증은 HTTPS(SSL)를 통해서만 사용해야 합니다.

Bearer Token (무기명 토큰)란, 

무기명 토큰은 OAuth 2.0과 함께 사용되는 주요 액세스 토큰 유형입니다. 전달자 토큰은 불투명한 문자열이며 이를 사용하는 클라이언트에게 의미가 없습니다. 일부 서버는 짧은 16진수 문자열인 토큰을 발행하는 반면, 다른 서버는 JSON 웹 토큰과 같은 구조화된 토큰을 사용할 수 있습니다.

그리고 token의 포맷의 하나입니다. JWT와 OAuth를 나타내는 인증 타입입니다. 베어러 토큰은 인증 서버에 의해 생성됩니다. 사용자가 애플리케이션 (클라이언트)을 인증하면 인증 서버는 토큰을 생성합니다. 베어러 토큰은 Oauth 2.0과 함께 사용되는 주요 유형의 액세스 토큰입니다.

액세스 토큰은 애플리케이션이 API에 액세스할 수 있도록 토큰 기반 인증에 사용됩니다. 예를 들어 캘린더 애플리케이션은 사용자의 예약된 이벤트를 읽고 새 이벤트를 생성할 수 있도록 클라우드의 캘린더 API에 액세스해야 합니다.

애플리케이션이 액세스 토큰을 받으면 API 요청 시 해당 토큰을 자격 증명으로 포함합니다. 그렇게 하려면 HTTP Authorization 헤더의 Bearer 자격 증명으로 액세스 토큰을 API에 전송해야 합니다.

Bearer Token 무기명 토큰의 장점

장점은 요청을 하기 위해 복잡한 라이브러리가 필요하지 않으며 클라이언트와 서버 모두 구현하기가 훨씬 간단하다는 것입니다.

Bearer Token 무기명 토큰의 단점

기술적으로 다른 토큰에 의해 덜 안전하다는 평가도 있는 편입니다. 그렇지만 OAuth 2.0에 대한 비판일 뿐, 대안과 방법도 있기 때문에 문제가 되지않습니다.

서비스에 보다 안전한 접근 방식이 필요한 경우 보안 요구 사항을 충족할 수 있는 다른 액세스 토큰 유형을 사용할 수 있습니다.

 


 

Node 필요한 모듈 설치

  • passport
  • passport-local
  • passport-jwt
  • jsonwebtoken
npm install passport passport-local passport-jwt jsonwebtoken --save

app.js

const passport = require('passport');
const passportConfig = require('./passport');

app.use(passport.initialize());
passportConfig();

passport에 관한 내용과 JWT 인증구현, Bearer 토큰에 관련 코드 및 설명들은 node express 프로젝트로 추후 이어서 깃허브 링크도 걸어서 포스팅하도록 하겠습니다. (바쁘네요.. 🥲 )

반응형

댓글