이글은 토큰기반의 인증을 왜 사용하느냐에 중점을 두어서 작성했습니다.

서버 기반의 인증

: 클라이언트로부터 요청을 받으면, 클라이언트의 상태를 계속해서 유지하고 이 정보를 서비스에 이용하는 Sateful 서버

  • 세션을 기반으로 정보저장(메모리, DB를 이용해 정보 저장)

<img width=40% src=./img/server-auth.png>

문제점

세션(session)

로그인 중인 사용자가 늘어날 경우에는 서버의 RAM에 부하가 걸리게 된다

확장성

사용자가 늘어나게 되면 더 많은 트래픽을 처리하기 위해 여러 프로세스를 돌리거나 컴퓨터를 추가하는 등 서버를 확장해야한다.
세션을 사용한다면 세션을 분산시키는 시스템을 설계해야 하지만 이러한 과정은 매우 어렵고 복잡한다.

CORS(Cross-Origin Resource Sharing)

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

이러한 문제들을 때문에 token 기반의 인증 시스템을 사용한다.

토큰 기반의 인증 시스템

: 인증받은 사용자들에게 토큰을 발급하고, 서버에 요청을 할 때 헤더에 토큰을 함께 보내도록 하여 유효성 검사를한다.

동작 과정

<img width=40% src=./img/token-auth.png>

  1. 사용자가 로그인을 한다
  2. 서버 측에서 해당 정보검증한다.
  3. 정보가 정확하다면 서버 측에서 사용자에게 Signed 토큰 발급

    signed는 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 Signature를 가지고 있다는 것

  4. 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때마다 해당 토큰을 서버에 함께 전달한다. 이때 Http 요청 헤더에 토큰을 포함시킨다.
  5. 서버는 토큰을 검증하고, 요청에 응답한다.

장점

  • 무상태성(Stateless) & 확장성(Scalability)

    토큰은 클라이언트 측에 저장되기 때문에 서버는 완전히 Stateless하며, 클라이언트와 서버의 연결고리가 없기 때문에 확장하기에 매우 적합하다.

  • 보안성

    쿠키 사용에 의한 취약점이 사라지게된다.

  • 확장성(Extensibility)
    시스템의 확장성을 의미하는 Scalability와 달리 Extensibility는 로그인 정보가 사용되는 분야의 확정을 의미

    토큰 기반의 인증 시스템에서는 토큰에 선택적인 권한만 부여하여 발급할 수 있으며 OAuth의 경우 Facebook, Google 등과 같은 소셜 계정을 이용하여 다른 웹서비스에서도 로그인을 할 수 있다.

  • 여러 플랫폼 및 도메인

    서버 기반 인증 시스템의 CORS 해결가능