[JWT] 서버기반인증 vs 토큰기반인증

mokyoungg·2020년 7월 27일
0

VELOPERT.LOG 를 참조하였습니다.
https://velopert.com/2350


아래 내용의 출처는 VELOPERT.LOG 입니다.

1. Stateful

Stateful 서버는 클라이언트에게서 요청을 받을 때마다,
클라이언트의 상태를 계속해서 유지하고, 이 정보를 서비스 제공에 이용합니다.

  • stateful 서버의 예제로는 세션을 유지하는 웹서버가 있습니다.
  • 유저가 로그인을 하면, 세션에 로그인이 되었다고 저장을 해두고, 서비스를 제공할 때에 그 데이터를 사용.
  • 여기서 세션은 서버컴퓨터의 메모리에 담을 때도 있고 데이터베이스 시스템에 담을 때도 있습니다.

2. 서버 기반 인증 시스템

2-1. 서버 기반 인증 시스템의 흐름

  • 서버측에서 유저들의 정보를 기억하고 있다.
  • 세션을 유지하기 위해 메모리 / 디스크 / 데이터베이스 시스템에 이를 담는다.

2-2. 서버 기반 인증의 문제점

세션

  • 유저가 인증을 할 때, 서버는 이 기록을 서버에 저장을 합니다. 이를 세션이라고 부릅니다.
  • 대부분의 경우엔 메모리에 이를 저장하는데, 로그인 중인 유저의 수가 늘어나면 서버의 램이 과부화가 된다.

확장성

  • 세션을 사용하면 서버를 확장하는 것이 어려워진다.
  • 서버의 확장이란, 단순히 서버의 사양을 업그레이드하는 것이 아니라, 여러대의 서버 컴퓨터를 추가하는 것을 의미.
  • 세션을 사용하면서 분산된 시스템을 설계하는 것은 매우 복잡한 과정.

CORS(Cross-Origin Resource Sharing)

  • 웹 어플리케이션에서 세션을 관리할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계.

3. Stateless

stateless는 무상태, 상태유지를 하지 않는다.
시스템에서는 유저의 인증 정보를 서버나 세션에 담아두지 않는다.

  • 상태정보를 저장하지 않아 클라이언트측에서 들어오는 요청만으로 작업을 처리한다.
  • 클라이언트와 서버의 연결고리가 없기 때문에 확장성이 높아진다.
  • 세션이 존재하지 않아 서버를 쉽게 확장할 수 있다.

4. 토큰 기반 인증 시스템

4-1. 토큰 기반 인증 시스템 사용 이유

  • 토큰 기반 인증 시스템의 작동원리는 stateless 이다.
  • 이 때문에, 위에 서술한 서버 기반 인증 시스템에서 발생하는 문제점들을 해소할 수 있다.(확장성)
  • 모바일 어플리케이션에 적합하다.(쿠키와 같은 인증시스템의 번거로움을 해결)
  • 인증정보를 다른 어플리케이션으로 전달(대표적으로, OAuth)
  • 보안

무상태(stateless)와 확장성(scalability)

토큰 기반 인증 시스템의 중요한 속성이다.
토큰은 클라이언트 사이드에 저장하기 때문에 완전히 stateless 하며, 서버를 확장하기에 매우 적합한
환경을 제공한다. 토큰을 사용하면 어떤 서버로 유저의 요청이 들어가던 상관없다.
(서버 기반일 때, 유저는 처음 로그인했었던 '그' 서버에만 요청을 보내도록 설정을 해야한다.)

Extensibilty(확장성)

로그인 정보가 사용되는 분야를 확장하는 것.
토큰을 사용하여 다른 서비스에서도 권한을 공유할 수 있다.
뿐만 아니라, 토큰에 선택적인 권한만 부여하여 발급할 수 있다.

여러 플랫폼 밑 도메인

어플리케이션과 서비스의 규모가 커지면, 여러 디바이스를 호환시키고 더 많은 종류의 서비스를 제공하게 된다.
토큰을 사용한다면, 그 어떤 디바이스나 어떤 도메인에서도 토큰만 유효하다면 요청이 정상적으로 처리된다.

OAuth란?

인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나
애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용된, 접근 위임을 위한 개방형 표준이다.
이 메커니즘은 여러 기업들에 의해 사용되는데, 이를테면 아마존, 구글, 페이스북, 마이크로소프트, 트위터가 있으며
사용자들이 타사 애플리케이션이나 웹사이트의 계정에 관한 정보를 공유할 수 있게 허용한다.
출처 : 위키백과

4-2. 토큰 기반 인증 시스템의 흐름

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


5. 마치며

처음 이 글을 읽었을 때.
토큰 기반 시스템의 차이가 무엇인지 명확하게 이해가 되지 않았다.
'서버측에서 유저들의 정보를 기억하고 있다'는 문장에서,
토큰 기반 시스템 역시 유저들에 대한 정보를 가지고 있어야
토큰을 발행하거나 확인하는 것이 아닌가라는 의문이 들었다.
(토큰은 하나인가. 이 토큰을 가지고 있는 유저는 그 누구라도 웹을 사용할 수 있는 것인가.)

위의 글에서 내가 주목한 부분은 '로그인 중인 유저의 수가 늘어나면' 이라는 부분이다.
내 생각에는 이 부분이 서버 기반 인증 시스템과 토큰 기반 인증 시스템의 차이점을 설명하는 부분같다.

현재의 내 이해는 이 정도이다.
토큰은 statless 이다. 서버에선 상태유지를 하지 않는다. 인증 정보를 서버나 세션에 담아두지 않는다.
토큰만 있으면 된다. 니가 다른 행성에서 와도 토큰만 있다면 보여주겠다.
너는 매우 위험한 놈이지만 토큰이 있으니 보여주겠다. 이런 거라면 stateful은 로그인 이후,
이 정보를 가지고 있다. 1명이든 2명이든 들어오는 대로 사람들을 세션에 저장해둔다.
이후 a라는 유저가 서비스를 요청하면 그 세션에서 확인하고 목록(?)에 있다면 서비스를 제공한다. 이런 차이인가.

요약해서,
토큰기반시스템은 '교통카드' 이다. 누구든 교통카드만 있으면 버스든 지하철이든 탄다.
그러나 서버기반시스템은 '예약제 식당' 인거다. 니가 로그인을(예약) 하고 서비스를 원했을 때,(식당에 찾아왔을 때)
식당에선(서버) 예약자 리스트(세션)에서 너를(유저) 확인하고 서비스를 제공한다.

맞나?

아니면...
서버 기반에선 유저에 대한 정보를 세션이라는 장소에 저장하며, 매번 그곳에서 확인을 해야한다.(회원 장부가 있다.)
그러나 토큰 기반에선 회원 장부는 없고 회원증이 있다. 그리고 이 회원증은 서버에서 관리하지 않고 클라이언트(유저)에게
지급된다.

따라서, 유저가 서비스를 원할 때 서버 기반은 서버 - 세션 - 유저인 반면에
토큰 기반은 서버 - (토큰을 가진) 유저 인것인가.

profile
생경하다.

0개의 댓글