참고자료
서버 기반 인증
- 기존의 인증 시스템은 서버 측에서 유저들의 정보를 기억하고 있어야함
- 이를 세션이라고 하고, 이를 유지하기 위해서는 여러가지방법이 사용됨. 주로 메모리 / 디스크 / 데이터베이스에 저장함
- 현재도 많은 시스템이 위의 방식을 채택하여 사용중. 하지만 웹/모바일 애플리케이션이 부흥하게 되면서 이런 방식의 인증시스템은 문제를 보이기 시작함
- 세션
- 유저가 인증 할 때 서버는 이 기록을 서버에 저장해야함. 이를 세션이라고 함
- 대부분의 경우 메모리에 저장. 하지만 유저의 수가 많으면 서버의 램이 과부하. 이를 피하기 위해서 데이터 베이스에 저장하기도 하지만 이 또한 유저의 수가 많다면 데이터 베이스의 성능에 무리를 줄 수도 있음
- 확장성
- 세션을 이용하면 서버를 확장하는 것이 제한 적임
- 단순히 서버의 사양을 업그레이드하는 것 뿐만 아니라, 더 많은 트래픽을 감당하기 위해 여러 개의 프로세스를 돌리거나 여러 대의 서버 컴퓨터를 추가하는 것을 의미
- 세션을 사용하여 분산된 시스템을 설계하는 것은 불가능 한 것은 아니지만 과정이 복잡함
- CORS
- cross-origin resource sharing
- 웹 앱에서 세션을 관리 할 때 자주 사용되는 쿠기는 단일 도메인 및 서브 도메인에서만 사용되도록 설계됨
- 따라서 쿠키를 여러 도메인에서 관리하는 것은 번거로움
토큰 기반의 시스템
- 토큰 기반 시스템은 stateless. 무상태. 즉 상태가 없음
- 이 시스템에서는 더 이상 유저의 정보를 서버나 세션에 저장하지 않음. 이 개념 하나만으로도 위에서 언급한 유저의 인증 정보를 서버 측에 담아둠으로 발생하는 이슈는 해소됌
- 세션이 존재하지 않으니 유저가 로그인 되어 있는지 아닌지도 신경 쓸 필요가 없음. 따라서 손 쉽게 서버를 확장할 수 있음
- 토큰 기반 시스템의 작동 원리
1. 유저가 로그인을 함
2. 서버 측에서 해당 계정 정보를 검증
3. 계정 정보가 맞다면 서버 측에서 유저에게 signed 토큰을 발급
4. 클라이언트는 해당 토큰을 저장하고 있다가 서버에 어떠한 요청을 할 때마다 해당 토큰을 서버에 함께 전달(HTTP 요청 헤더에 토큰 값을 포함 시킴)
5. 서버는 토큰을 검증하고 요청
토큰 시스템의 장점
- 무상태 및 높은 확장성
- 토큰 기반의 인증 시스템의 중요한 속성
- 토큰을 클라이언트 사이드에서 저장하기 때문에 완전하게 무상태성을 가짐. 또한 서버를 확장하기에 큰 어려움이 없음
- 만약 세션을 서버에 저장하고 있고 서버가 여러대라면. 어떤 유저가 로그인 했을 때 그 유저는 처음 로그인 했을 때의 서버에만 요청을 보내야함
- 보안성
- 클라이언트가 서버에 요청을 보낼 때 더 이상 쿠키를 전달하지 않아도됌
- 쿠키를 사용하면서 발생하는 취약점이 사라짐
- 확장성
- 여기서의 확장성의 개념은 서버의 확장성의 개념이 아닌. 활용분야의 확장성
- 인증 정보가 활용되는 (ex. 로그인) 분야에 대한 확장성.
- 토큰을 사용하면 다른 서비스에도 권한을 공유할 수 있음(하나의 계정 정보로 여러 페이지의 계정을 로그인 할 수 있음)
- 또한 토큰에 선택적인 권한을 부여하여 발급할 수 있음(해당 토큰을 통해 조회는 가능하지만 포스트는 안되는 등의 기능)
- 여러 플랫폼 및 도메인
- 애플리케이션과 서비스의 규모가 커지면서 여러 디바이스를 호환시키고 더 많은 종류의 서비스를 제공해야함
- 토큰을 사용한다면 그 어떤 디바이스에도, 어떤 도메인에서도 토큰만 유효하다면 요청이 정상적으로 처리
토큰 시스템의 단점
- 무상태성
- 상태가 없기 때문에 한 번 토큰이 생성되면 제어가 불가능함. 따라서 토큰을 임의로 삭제 하는 것이 불가능하므로 토큰 만료시간을 꼭 넣어주어야함
- 토큰의 크기
- 정보가 많아질 수록 토큰의 길이가 늘어나게 되어 네트워크의 부하를 줄 수 있음
- 토큰 자체에 정보를 담고 있으므로 양날의 검이 될 수 있음