본문 바로가기

IT/Node.js

[JWT] 토큰(Token) 기반 인증에 대한 소개

[JWT] 토큰(Token) 기반 인증에 대한 소개

 

[JWT] 토큰(Token) 기반 인증에 대한 소개 | VELOPERT.LOG

소개 토큰(Token) 기반 인증은 모던 웹서비스에서 정말 많이 사용되고 있습니다. 여러분이 API 를 사용하는 웹서비스를 개발한다면, 토큰을 사용하여 유저들의 인증작업을 처리하는것이 가장 좋은

velopert.com

 

요약

 

토큰 기반 인증 시스템 선택의 이유

Stateless 서버

cf.  Stateful 서버

클라이언트에게서 요청을 받을 때 마다, 클라이언트의 상태를 계속해서 유지하고, 이 정보를 서비스 제공에 이용합니다. stateful 서버의 예제로는 세션을 유지하는 웹서버가 있습니다. 예를들어 유저가 로그인을 하면, 세션에 로그인이 되었다고 저장을 해 두고, 서비스를 제공 할 때에 그 데이터를 사용하지요. 여기서 이 세션은, 서버컴퓨터의 메모리에 담을 때도 있고, 데이터베이스 시스템에 담을 때도 있습니다.

Stateless 서버는 상태를 유지 하지 않습니다. 상태정보를 저장하지 않으면, 서버는 클라이언트측에서 들어오는 요청만으로만 작업을 처리합니다. 이렇게 상태가 없는 경우 클라이언트와 서버의 연결고리가 없기 때문에 서버의 확장성 (Scalability)이 높아집니다.

 

 

모바일 어플리케이션에 적합

만약에 Android / iOS 모바일 어플리케이션을 개발 한다면, 안전한 API 를 만들기 위해선 쿠키같은 인증시스템은 이상적이지 않습니다.

 

인증정보를 다른 어플리케이션으로 전달

대표적인 예제로는, OAuth 가 있습니다. 페이스북/구글 같은 소셜 계정들을 이용하여 다른 웹서비스에서도 로그인 할 수 있게 할 수 있습니다.

 

보안

토큰 기반 인증 시스템을 사용하여 어플리케이션의 보안을 높일 수 있습니다. 단, 이 토큰 기반 인증을 사용한다고 해서 무조건 해킹의 위험에서 벗어나는건 아닙니다.

 

 

왜 토큰을 사용?

서버 기반 인증

 

세션

서버 메모리에 로그인 정보를 저장. 많아지면, 서버의 램 과부화 데이터베이스 저장 방식도 역시 많아지면, 데이터베이스의 성능에 무리

확장성

세션을 사용하면 서버를 확장하는것이 어려움. 트래픽을 감당하기 위하여 여러개의 프로세스를 돌리거나, 여러대의 서버 컴퓨터를 추가 하려면 분산된 시스템을 설계하는건 불가능한것은 아니지만 과정이 매우 복잡해짐.

CORS (Cross-Origin Resource Sharing)

웹 어플리케이션에서 세션을 관리 할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어있습니다. 따라서 쿠키를 여러 도메인에서 관리하는것은 좀 번거롭습니다.

 

토큰 기반 인증

토큰 기반 시스템은 stateless 합니다. 무상태. 즉 상태유지를 하지 않는다는 것.

  1. 유저가 아이디와 비밀번호로 로그인
  2. 서버측에서 해당 계정정보를 검증
  3. 계정정보가 정확하다면, 서버측에서 유저에게 signed 토큰을 발급
    여기서 signed 의 의미는 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 signature 를 지니고 있다는 것.
  4. 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때 마다, 해당 토큰을 함께 서버에 전달
  5. 서버는 토큰을 검증하고, 요청에 응답.

 

웹서버에서 토큰을 서버에 전달 할 때에는, HTTP 요청의 헤더에 토큰값을 포함시켜서 전달.

 

무상태(stateless) 이며 확장성(scalability).

보안성

클라이언트가 서버에 요청을 보낼 때, 더 이상 쿠키를 전달하지 않음으로 쿠키를 사용함으로 인해 발생하는 취약점이 사라짐.

Extensibility (확장성)

ex) 스타트업 구인구직 웹서비스인 로켓펀치에서는 Facebook, LinkedIn, GitHub, Google 계정으로 로그인 가능

여러 플랫폼 및 도메인

어플리케이션과 서비스의 규모가 커지면, 우리는 여러 디바이스를 호환 시키고, 더 많은 종류의 서비스를 제공해야함.

토큰을 사용한다면, 그 어떤 디바이스에서도, 그 어떤 도메인에서도, 토큰만 유효하다면 요청이 정상적으로 처리.

서버측에서 어플리케이션의 응답부분에 다음 헤더만 포함시켜주면 됨.

Access-Control-Allow-Origin: *

이런 구조라면, assets 파일들(이미지, css, js, html 파일 등)은 모두 CDN 에서 제공을 하도록 하고,

서버측에서는 오직 API만 다루도록 하도록 설계가능

웹 표준 기반

토큰 기반 인증 시스템의 구현체인 JWT는 웹 표준 RFC 7519 에 등록. 따라서 여러 환경에서 지원 가능.

'IT > Node.js' 카테고리의 다른 글

npm이란 무엇일까?  (0) 2021.02.18
nvm 버전 고정하기  (0) 2020.12.02
JSON Web Token 소개 및 구조  (0) 2020.09.17
nvm 설치  (0) 2020.06.08
Node.js 실습 및 예제  (0) 2017.12.28