2021. 12. 8. 00:45ㆍ보안\암호화
서버 기반 인증 시스템
서버 기반 인증 시스템이란 서버 측에서 사용자들의 정보를 기억하고 있는 시스템을 말합니다. 사용자들의 정보를 기억하기 위해서는 세션을 유지해야 하는데, 메모리나 디스크 또는 데이터베이스 등을 통해 관리합니다. 서버 기반의 인증 시스템은 클라이언트로 요청을 받으면 클라이언트의 상태를 계속 유지하고 이 정보를 서비스에 이용합니다.
서버 기반 인증 시스템의 문제점
세션
사용자가 인증을 할 때, 서버는 이러한 정보를 저장하고 이를 세션이라고 부릅니다. 대부분의 경우에는 메모리에 저장하는데 로그인 중인 사용자가 많으면 서버의 RAM에 부하가 걸리게 됩니다. 이를 피하기 위해 데이터베이스에 저장하기도 하는데 이러한 방식 역시 데이터베이스에 무리를 줄 수 있습니다.
확장성
사용자가 늘어나게 되면 더 많은 트래픽을 처리하기 위해 여러 프로세스를 돌리거나 컴퓨터를 추가하는 등 서버를 확장해야합니다. 세션을 사용한다면 세션을 분산시키는 시스템을 설계해야 하지만 이러한 과정을 매우 어렵고 복잡합니다.
CORS
웹 어플리케이션에서 세션을 관리할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있습니다. 따라서 쿠키를 여러 도메인에서 관리하는 것은 번거롭습니다.
토큰 기반 인증 시스템
토큰 기반 인증 시스템은 인증받은 사용자들에게 토큰을 발급하고 서버에 요청을 할 때 헤더에 토큰을 함께 보내도록 하여 유효성 검사를 합니다. 이러한 시스템에서는 더 이상 사용자의 인증 정보를 서버나 세션에 유지하지 않고 클라이언트 측에서 들어오는 요청만으로 작업을 처리합니다.
토큰 기반 인증 시스템의 이점
무상태성과 확장성
토큰은 클라이언트 측에 저장되기 때문에 서버는 완전히 Stateless하며, 클라이언트와 서버의 연결고리가 없기 때문에 확장하기에 매우 적합합니다. 만약 사용자 정보가 서버 측 세션에 저장된 경우에 서버를 확장하여 분산처리 한다면, 해당 사용자는 처음 로그인 했었던 서버에만 요청을 받도록 설정해야합니다. 하지만 토큰을 사용한다면 어떠한 서버로 요청이 와도 상관이 없습니다.
여러 플랫폼 및 도메인
토큰을 사용함으로서 어떤 디바이스 어떤 도메인에서도 토큰의 유효성 검사를 진행한 후에 요청을 처리할 수도 있습니다.
토큰 기반 인증 시스템의 문제
stateless한 특성
토큰이 만약 탈취된다면 토큰이 만료될 때까지 강제로 토큰을 만료시킬 수 없습니다. 이러한 상황을 해결하기 위해 토큰의 만료 주기를 너무 짧게 하면 수시로 로그인을 다시 하게 되어 사용자가 불편해지고 만료 주기를 길게 하면 토큰이 탈취당했을 때 피해가 커지게 됩니다.
이를 보완하기 위해 보통은 리프레시 토큰과 액세스 토큰으로 나누어 사용하고 있습니다. 이 방식은 만료 주기가 짧은 액세스 토큰과 보안이 철저하고 만료 주기가 긴 리프레시 토큰을 사용합니다. 액세스 토큰을 탈취당하더라도 보안이 철저한 리프레시 토큰을 탈취하지 못하면 공격할 수 있는 시간은 얼마 되지 않기 때문에 피해가 적어집니다.
토큰 저장 위치
웹 스토리지
서버로 부터 받은 토큰 값을 웹 스토리지에 넣고 요청을 할 때마다 헤더에 넣어서 요청하는 방법입니다. 이 방법은 구현하기 쉽고 하나의 도메인에 제한되어 있지 않다는 장점이 있지만, XSS 해킹을 통해 토큰이 쉽게 탈취될 수 있습니다.
쿠키
쿠키를 정보 전송 수단으로 사용합니다. 쿠키를 설정해줄 때, HttpOnly 값을 활성화 해주면, 네트워크 통신 상에서만 해당 쿠키가 붙게 됩니다. 따라서 브라우저상에서는 스크립트로 토큰 값에 접근하는 것이 불가능해집니다. 다만, 쿠키가 한정된 도메인에서만 사용됩니다. 그리고 CSRF 공격에 위험이 생깁니다. 이러한 CSRF는 HTTP 요청 Referer 체크, CSRF 토큰 사용을 통해 방지할 수 있습니다.