[Back-end] Token 인증

Geun·2022년 3월 31일
0

Back-end

목록 보기
41/74

Token

서버(세션) 기반의 인증 시스템

이미 있던 기존의 인증 시스템으로 서버 기반 인증 시스템이 있다.

서버기반의 인증시스템은 서버 측에서 사용자들의 정보를 기억하고 있어야 한다.
사용자들의 정보를 기억하기 위해 세션을 유지해야 하는데, 메모리나 디스크 또는 데이터베이스 등을 통해 관리한다.
서버 기반의 인증시스템은 클라이언트로부터 요청을 바등면, 클라이언트의 상태를 계속해서 유지하고 이 정보를 서비스에 이용한다. 이를 Stateful 서버라고 한다.

소규모 시스템에서는 아직 사용되지만, 웹/앱 어플리케이션이 발달하면서 서버를 확장하기 어렵거나 하는 문제가 있었다.

  • 세션
    유저가 인증을 할때 서버는 이 기록을 서버에 저장해야한다. 이를 세션이라고 부른다.
    대부분의 경우 메모리에 이를 저장하는데, 로그인 중인 유저의 수가 늘어난다면 서버 램에 과부하가 올수 있다.
    이를 해결하기 위해 세션을 데이터베이스 시스템에 저장하는 방식도 있지만 마찬가지로 데이터베이스 성능에 무리를 줄 수 있는 문제가 있다.

  • 확장성
    세션을 사용하면 서버 확장이 어려워진다.
    서버의 확장은 더 많은 트래픽을 감당하기 위해 여러 개의 프로세스를 돌리거나, 여러 대의 서버 컴퓨터를 추가하는 것을 의미한다.
    세션을 사용하면서 분산된 시스템을 설계하는 것이 불가능한 일은 아니지만 매우 복잡한 과정이다.

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

위 같은 문제들이 있어 Token 기반의 인증시스템을 사용하게 되었다.

토큰 기반의 인증 시스템

토큰 기반의 인증 시스템은 인증받은 사용들에게 Token을 발급하고, 서버에 요청을 할 때 헤더에 Token을 함께 보내도록 해서 유효성 검사를 한다.
이런 시스템에서는 사용자의 인증 정보를 서버나 세션에 유지하지 않고 클라이언트 측에서 들어오는 요청만으로 작업을 처리한다. 이에따라 상태를 유지하지 않게되므로 Stateless한 구조를 갖는다.

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

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

Token의 장점

  • 무상태(Stateless)이며 확장성(Scalability)가 있다.
    토큰은 클라이언트 측에 저장되기 때문에 서버는 Stateless하다.
    클라이언트와 서버의 연결고리가 없기 때문에 확장하기에 좋다.

  • 보안성
    클라이언트가 서버로 요청을 보낼 때 더 이상 쿠키를 전달하지 않으므로 쿠키사용에 의한 취약점이 사라지게 된다.
    하지만 토큰 환경의 취약점이 있을 수 있으니 이것은 생각해야한다.

  • 확장성(Extensibility)
    시스템의 확장성을 의미하는 Scalability와 달리 Extensibility는 로그인 정보가 사용되는 분야의 확정을 의미한다.
    토근 기반 인증 시스템에서는 토큰에 선택적인 권한만 부여하여 발급할 수 있으며 OAuth의 경우 Facebook, Google, Naver 같은 소셜 계정을 이용해 다른 웹 서비스에서도 로그인할 수 있다.

  • 여러 플랫폼 및 도메인
    서버 기반 인증 시스템의 문제점 중 하나인 CORS를 해결할 수 있는데, 어플리케이션과 서비스의 규모가 커지면 여러 디바이스를 호환시키고 더 많은 종류의 서비스를 제공하게 된다.
    토큰을 사용하면 어떤 디바이스, 어떤 도메인에서도 토큰의 유효성 검사를 진행한 후에 요청을 처리할 수 있다.
    이런 구조로 assets 파일(Image, html, css, js)는 모두 CDN에 제공하고, 서버 측에서는 API만 다루게 설계할 수 있다.

최근에는 JSON 포맷을 사용하는 JWT(Json Web Token)을 사용한다고 한다.

참고자료

0개의 댓글