본문 바로가기

Back-end & Server/Node.js

[Node.js] 토큰(Token) 기반 인증

728x90
반응형

 

토큰(Token)

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

 

토큰 기반 인증 시스템을 선택하는 이유

 

Stateless 서버

  • Stateful 서버 - 클라이언트에게서 요청을 받을 때 마다, 클라이언트의 상태를 계속 유지하고, 이 정보를 서비스 제공에 이용한다.
  • Stateful 서버의 예시로는 세션을 유지하는 서버가 있다.
  • Stateless 서버는 상태를 유지하지 않고, 서버는 클라이언트측에서 들어오는 요청만으로만 작업을 처리한다.
  • 상태가 없는 경우 클라이언트와 서버의 연결고리가 없기 때문에 서버의 확장성(Scalability)이 높아진다.

 

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

  • 모바일 APP을 개발 한다면, 안전한 API를 만들기 위해서 쿠키 같은 인증 시스템은 이상적이지 않다.
  • 토큰 기반 인증을 도입한다면, 더욱 간단하게 이 번거로움을 해결할 수 있다.

 

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

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

 

보안

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

 

 

토큰 기반 인증을 사용하게 된 계기

과거의 인증 시스템 - 서버 기반 인증

기존의 인증 시스템은 서버측에서 유저 정보를 기억하고 있어야한다.

웹/모바일 웹 어플리케이션들이 부흥하게 되면서 여러가지 문제점이 시작했다.

  • 세션 - 유저 수가 많은 경우엔 서버의 성능에 무리를 줄 수 있다.
  • 확장성 - 트래픽을 감당하기 위해 서버 컴퓨터를 늘려야한다. 세션을 사용하면서 분산된 시스템을 설계하는건 불가능한것은 아니지만 과정이 매우 복잡해진다.
  • CORS(Cross-Origin Resource Sharing) - 웹 APP 세션을 관리할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있다. 따라서 쿠키를 여러 도메인에서 관리하는 것은 번거롭다.

 

 

최근 - 토큰 기반 시스템의 작동 원리

 

과정

  • 유저가 아이디와 비밀번호로 로그인한다.
  • 서버측에서 해당 계정정보를 검증한다.
  • 계정 정보가 정확하다면, 서버측에서 유저에게 signed 토큰을 발급해 준다.
  • 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때 마다, 해당 토큰을 함께 서버에 전달한다.
  • 서버는 토큰을 검증하고, 요청에 응답한다.

 

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

 

 

토큰의 장점

  • 무상태(Stateless)이며 확장성(Scalability)이 있다.
    • 토큰은 클라이언트 사이드에 저장하기 때문에 완전히 stateless하며, 서버 확장에 매우 적합하다.
    • 어떤 유저가 로그인 했을땐, 어떤 서버로 요청이 들어가던 상관 없다.

 

  • 보안성
    • 클라이언트가 서버로 요청을 보낼 때, 더 이상 쿠키를 전달 하지 않음으로 쿠키로 인한 취약점이 사라진다.
    • 하지만, 토큰 사용하는 환경에서의 취약점이 존재할 수 있으므로 언제나 취약점에 대비해야 한다.

 

  • Extensibility(확장성)
    • 로그인 정보가 사용되는 분야를 확장하는 것을 의미한다.
    • 토큰을 사용하여 다른 서비스에서도 권한을 공유할 수 있다.
    • 토큰 기반 서비스에서는 토큰에 선택적인 권한만 부여하여 발급 할 수 있다.
    • ex. 제3자 사이트에서 sns에 프로필 정보를 가져오는 권한은 있어도, 포스트를 작성하는 권한은 없다.

 

  • 여러 플랫폼 및 도메인
    • 토큰 사용시, 어떤 디바이스에서도, 어떤 도메인에서도, 토큰만 유효하다면 요청이 정상적으로 처리된다.
    • 서버측에서 어플리케이션 응답부분에 다음 헤더만 포함시켜주면된다.
Access-Control-Allow-Origin: *

 

  • 웹 표준 기반
    • 토큰 기반 인증 시스템의 구현체인 JWT는 웹 표준 RFC 7519에 등록되어 있다.
    • 여러 환경에서 지원되며 여러 회사 Infra Structure에 사용되고 있다.

 

728x90
반응형

'Back-end & Server > Node.js' 카테고리의 다른 글

[Node.js] JWT  (0) 2023.08.01
[Node.js] 자주 쓰는 의존성 패키지  (0) 2023.07.31
[Node.js] Express.js  (0) 2023.07.31
[Node.js] 클라이언트  (0) 2023.07.30
[Node.js] Event Loop  (0) 2023.07.29