본문 바로가기

CS/Networking

01/06 세션 기반 인증 VS 토큰 기반 인증

인증(Authentication)

  • 사용자가 누구인지 확인하는 절차로, 대표적으로 회원가입, 로그인 과정이 있다.
    • 일반적으로 웹 서버는 HTTP 즉, stateless 프로토콜을 사용하기 때문에 웹사이트에서 사용자가 로그인한 회원인지에 대한 인증을 관리하는 방안이 필요하다.

인가(Authorization)

  • 사용자가 요청(Request)하는 동작을 할 수 잇는 권한이 있는지 확인하는 절차이다.
    • 예를들어, 글을 수정하거나 삭제하는 작업은 권한이 있는 사용자만 가능, 이때 권한이 있는지 여부를 확인하는 절차를 인가라고 한다.

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

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

 

 

이러한 인증 방식은 소규모 시스템에서는 많이 사용되고 있지만, 웹/앱 어플리케이션이 발달하게 되면서 서버를 확장하기가 어렵다는 등 다음과 같은 문제점을 보이기 시작했다.

  • 세션
    • 사용자가 인증을 할 때, 서버는 이러한 정보를 저장해야 하고 이를 세션(Session)이라고 부른다. 대부분의 경우 메모리에 저장을 하는데, 사용자가 늘어날 경우에는 서버의 RAM에 부하가 걸리게 된다. 이를 피하기 위해 데이터베이스에 저장을 하는데, 이 경우도 데이터베이스에 무리를 줄 수 있다.
  • 확장성
    • 사용자가 늘어나게 되면 더 많은 트래픽을 처리하기 위해 여러 프로세스를 돌리거나 컴퓨터를 추가하는 등 서버를 확장해야 한다. 세션을 사용한다면 세션을 분산시키는 시스템을 설계해야 하지만 이러한 과정은 매우 어렵고 복잡하다.
  • CORS(Cross-Origin Resource Sharing)
    • 웹 어플리케이션에서 세션을 관리할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있다. 따라서 쿠키를 여러 도메인에서 관리하는 것은 번거롭다.

물론 토큰 기반 인증에 비해 정보가 서버에 저장되기 때문에 정보의 위변조 혹은 손상 우려가 없다.

토큰 기반 인증 시스템

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

토큰 기반 인증 시스템의 작동 과정

  1. 사용자가 아이디와 비밀번호로 로그인을 한다.
  2. 서버 측에서 해당 정보를 검증한다.
  3. 정보가 정확하다면 서버 측에서 사용자에게 Signed 토큰을 발급한다. (Signed는 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 Signature를 가지고 있다는 것)
  4. 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때마다 해당 토큰을 서버에 함께 전달한다. 이때 Http 요청 헤더에 토큰을 포함시킨다.
  5. 서버는 토큰을 검증하고, 요청에 응답한다.

토큰 기반 인증 시스템의 이점

  • 무상태성(Statelss) & 확장성(Scalability)
    • 토큰은 클라이언트 측에 저장되기 때문에 서버는 완전히 Stateless하며, 클라이언트와 서버의 연결고리가 없기 때문에 확장하기에 매우 적합하다. 만약 사용자 정보가 서버 측 세션에 저장된 경우에 서버를 확장하여 분산처리 한다면, 해당 사용자는 처음 로그인 했었던 서버에만 요청을 받도록 설정을 해주어야 한다. 하지만 토큰을 사용한다면 어떠한 서버로 요청이 와도 상관이 없다.
  • 보안성
    • 클라이언트가 서버로 요청을 보낼 때 더 이상 쿠키를 전달하지 않으므로, 쿠키 사용에 의한 취약점이 사라지게 된다. 하지만 토큰 환경의 취약점이 존재 할 수 있으므로 이에 대비해야 한다.
  • 확장성(Extensivility)
    • 시스템의 확장성을 의미하는 Scalability와 달리 Extensibility는 로그인 정보가 사용되는 분야의 확정을 의미한다. 토큰 기반의 인증 시스템에서는 토큰에 선택적인 권한만 부여하여 발급할 수 있으며 OAuth의 경우 Facebook, Google 등과 같은 소셜 계정을 이용하여 다른 웹서비스에서도 로그인을 할 수 있다.
  • 여러 플랫폼 및 도메인
    • 서버 기반 인증 시스템의 문제점 중 하나인 CORS를 해결할 수 있는데, 애플리케이션과 서비스의 규모가 커지면 여러 디바이스를 호환시키고 더 많은 종류의 서비스를 제공하게 된다. 토큰을 사용한다면 어떤 디바이스, 어떤 도메인에서도 토큰의 유효성 검사를 진행한 후에 요청을 처리할 수 있다. 이런 구조를 통해 assests 파일(Image, html, css, js 등)은 모두 CDN에서 제공하고, 서버 측에서는 API만 다루도록 설게할 수 있다.

'CS > Networking' 카테고리의 다른 글

01/10 TCP 프로토콜 연결/종료 과정  (0) 2023.01.10
01/09 브라우저에서 구글(서버 응답)까지 흐름  (1) 2023.01.09
01/05 IPv4 VS IPv6  (0) 2023.01.05
01/04 도메인  (0) 2023.01.04
01/03 OCI 7 Layer, TCP/IP 4 Layer  (0) 2023.01.03