서버 기반 인증 방식 vs 토큰 기반 인증

이병수·2020년 10월 19일
2

오늘은 웹서비스에 필수적인 개념 토큰 인증에 대한 개념을 알아보자! 🤲

인증 & 인가

우선 인증과 인가는 무엇을 말하는 것일까 ?

이전에 한번 정리한 적이 있어 간단히 얘기하면
(인증과 인가)

인증

  • 인증은 유저의 아이디와 비번 등 유저의 identification을 확인하는 절차이다.

인가

  • 인가란 유저에게 권한을 허락하는 것이다.

필요성

  • 누가, 언제, 어떻게 쓰고 있는가를 파악하기 위해 어떤 사이트에서든 인증, 인가가 있다.
  • 인증과 인가는 API에서 가장 자주 구현되는 기능중 하나
  • Private한 API는 물론이고 Public한 API도 기본적인 인증과 인가를 요구.

그렇다면 이제 인증 방식에 대해 알아보자

서버(세션)기반 인증방식

토근 기반 인증이 없었을 때의 인증 시스템은 서버 측에서 유저들의 정보를 기억하고 있어야 했다
서버 기반 인증 시스템의 흐름을 보자면 다음과 같다.

서버 기반 인증의 문제점

메모리 과부화

  • 유저가 인증을 할 때, 서버는 이 기록을 서버에 저장을 해야 하는데 이를 세션이라고 한다. 대부분의 경우 메모리에 저장하는데, 유저의 수가 급격히 늘어난다면 서버의 램이 과부화된다.
  • 이를 피하기 위해 데이터베이스에 저장하는 방식도 있으나 유저의 수가 많으면 데이터베이스 성능에 무리를 줄 수 있다.

확장성 문제

  • 세션을 사용하면 서버를 확장하기 어려워 진다. 서버의 확장은 더 많은 트래픽을 감당하기 위하여 여러개의 프로세스를 돌리거나 여러대의 서버 컴퓨터를 추가하는 것을 의미한다.

CORS(Cross-Origin Resource Sharing)

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

토큰기반 인증방식

토큰기반 인증방식 작동원리

  • 토큰 기반 시스템은 stateless하다. 즉 상태유지를 하지 않는다. 이 시스템에서는 더 이상 유저의 정보를 서버나 세션에 담아두지 않는다.

이 개념만으로 위에서 서술한 서버 기반 인증 방식의 많은 문제점이 해소된다.

  • 서버측 메모리 과부화 해소
  • 세션이 존재하지 않으니 유저들이 로그인 되어있는 지 신경 쓰지 않으면서 서버를 손쉽게 확장

구현방식

토큰 기반 시스템의 구현 방식은 시스템마다 크고작은 차이가 있겠지만, 대략적으로 보면 다음과 같다.

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

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

토큰의 방식

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

  • 토큰은 클라이언트 사이드에서 저장하기 때문에 완전히 stateless하다 그렇기에 서버를 확장하기에 매우 적합한 환경을 제공한다

만약에 세션을 서버 측에서 저장하고 있고 서버를 여러대를 사용하여 요청을 분산하였다면 어떤 유저가 로그인 시 처음 로그인했던 그 서버에만 요청을 보내도록 설정을 해야한다. 하지만 토큰은 이 문제를 해결한다.

2) 보안성

  • 클라이언트가 서버에 요청을 보낼 때 더 이상 쿠키글 전달하지 않음으로 쿠키를 사용함으로서 인해 발생하는 취약점이 사라진다.
    (하지만 토큰을 사용하는 환경에서도 취약점이 존재한다)

    3) 확장성(Extensibility)

  • Extensibility 는 로그인 정보가 사용되는 분야를 확장하는것을 의미. 토큰을 사용하여 다른 서비스에서도 권한을 공유 할 수 있다.

    예를 들어서, 스타트업 구인구직 웹서비스인 로켓펀치에서는 Facebook, LinkedIn, GitHub, Google 계정으로 로그인을 할 수 있다.

4) 여러 플랫폼 및 도메인

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

Reference

1) Stateless vs Stateful Servers

http://orca.st.usm.edu/~seyfarth/network_pgm/net-6-3-3.html

2) https://velopert.com/2350

0개의 댓글