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

서버 기반의 인증

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

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

문제점

세션(session)

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

확장성

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

CORS(Cross-Origin Resource Sharing)

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

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

토큰 기반의 인증 시스템

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

동작 과정

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

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

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

장점

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

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

  • 보안성

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

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

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

  • 여러 플랫폼 및 도메인

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