본문 바로가기

Web Development/Django

[Web] 토큰(Token) 기반 인증의 개념 및 장점

728x90

토큰(Token) 기반 인증은 모던 웹서비스에서 정말 많이 사용되고 있는 방법이며, API 를 사용하는 웹서비스를 개발한다면, 토큰을 사용하여 유저들의 인증작업을 처리하는것이 가장 좋은 방법이다.

 

과거 서버 기반 인증의 한계

기존의 서버 기반 인증 시스템은 유저들의 정보를 서버측(메모리/디스크/데이터 베이스 시스템)에서 기억하고 있어야 한다. 

하지만, 웹/ 모바일 어플리케이션이 부흥하게 되면서 위 방식의 인증 시스템은 아래와 같은 문제점이 발생했다. 

세션

유저가 인증을 할 때, 서버는 이 기록을 서버에 저장을 해야하며, 이를 세션 이라고 부른다. 대부분의 경우엔 메모리에 저장하게 되는데, 만약 로그인 중인 유저의 수가 늘어난다면 서버의 램이 과부화되는 현상이 발생한다. 이를 피하기 위해서, 세션을 데이터베이스에 시스템에 저장하는 방식도 있지만, 이 또한 유저의 수가 많으면 데이터베이스의 성능에 무리를 줄 수 있다.

확장성

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

CORS (Cross-Origin Resource Sharing)

웹 어플리케이션에서 세션을 관리 할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어있다. 따라서 쿠키를 여러 도메인에서 관리하는것은 좀 번거롭다. 이때, CORS (Crosss-Origin Resource Sharing)란, 웹 페이지 상의 제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으로부터 요청할 수 있게 허용하는 것이다.

토큰 기반 인증의 장점

stateless, scalability

토큰 기반 시스템은 유저의 인증 정보를 서버나 세션에 담아두지 않는다. 이를 Stateless 라고 하며, stateless 서버는 클라이언트측에서 들어오는 요청만으로만 작업을 처리해 클라이언트와 서버의 연결고리가 없기 때문에 서버의 확장성 (Scalability) 이 높아진다.

예를 들어, 만약에 세션을 서버측에 저장하고 있고, 서버를 여러대를 사용하여 요청을 분산하였다면, 어떤 유저가 로그인 했을땐, 그 유저는 처음 로그인했었던 그 서버에만 요청을 보내도록 설정을 해야한다. 하지만, 토큰을 사용한다면, 어떤 서버로 요청이 들어가던, 상관이 없다. 

반대로, Stateful 서버는 클라이언트에게서 요청을 받을 때 마다, 클라이언트의 상태를 계속해서 유지하고, 이 정보를 서비스 제공에 이용하는 서버이다.  stateful 서버의 예제로는 세션을 유지하는 웹서버가 있다. 예를 들어 유저가 로그인을 하면, 세션에 로그인이 되었다고 저장을 해 두고, 서비스를 제공 할 때에 그 데이터를 사용한다. 여기서 이 세션은, 서버컴퓨터의 메모리에 담을 때도 있고, 데이터베이스 시스템에 담을 때도 있다. 

Extensibility

Extensibility 는 토큰을 사용하여 다른 서비스에서도 권한을 공유 하는 등 로그인 정보가 사용되는 분야를 확장할 수 있다(대표적인 예제로는, OAuth 가 있다). 예를 들어, 웹서비스에서는 Facebook, LinkedIn, GitHub, Google 계정으로 로그인을 했을 때, 토큰 기반 시스템에서는, 토큰에 선택적인 권한만 부여하여 발급을 할 수 있다 (예를 들어, 페이스북 계정으로 로그인을 했다면, 프로필 정보를 가져오는 권한은 있어도, 포스트를 작성 할 수 있는 권한은 없게 구현)

보안

토큰 기반 인증 시스템을 사용하면, 클라이언트가 서버에 요청을 보낼 때, 더 이상 쿠키를 전달하지 않기 때문에 쿠키를 사용함으로 인해 발생하는 취약점이 사라진다. 따라서, 토큰 기반 인증 시스템을 사용하여 어플리케이션의 보안을 높일 수 있다 (단, 이 토큰 기반 인증을 사용한다고 해서 무조건 해킹의 위험에서 벗어나는건 아니다)

여러 플랫폼과 도메인에 적합

어플리케이션과 서비스의 규모가 커지면, 여러 디바이스를 호환 시키고, 더 많은 종류의 서비스를 제공하게 된다. 토큰을 사용한다면, 그 어떤 디바이스에서도, 그 어떤 도메인에서도, 토큰만 유효하다면 요청이 정상적으로 처리 된다. 서버측에서 어플리케이션의 응답부분에 다음 과 같이 헤더만 포함시켜주면 된다.

Access-Control-Allow-Origin: *

이런 구조라면, assets 파일들(이미지, css, js, html 파일 등)은 모두 CDN 에서 제공을 하도록 하고, 서버측에서는 오직 API만 다루도록 하도록 설계 할 수도 있다. 

또한, Android / iOS 모바일 어플리케이션을 개발 할 때, 안전한 API 를 만들기 위해서 쿠키 컨테이너 대신 토큰 기반 인증을 도입한다면, 인증 시스템 개발의 번거로움을 해결 할 수 있다.

 

토큰 기반 시스템의 작동 원리

1) 유저가 아이디와 비밀번호로 로그인

2) 서버측에서 해당 계정정보를 검증

3) 계정정보가 정확하다면, 서버측에서 유저에게 signed 토큰을 발급
여기서 signed 의 의미는 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 signature 를 지니고 있음을 의미

4) 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때 마다, 해당 토큰을 함께 서버에 전달

5) 서버는 토큰을 검증하고, 요청에 응답

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

 

Reference

 

[JWT] 토큰(Token) 기반 인증에 대한 소개 | VELOPERT.LOG

소개 토큰(Token) 기반 인증은 모던 웹서비스에서 정말 많이 사용되고 있습니다. 여러분이 API 를 사용하는 웹서비스를 개발한다면, 토큰을 사용하여 유저들의 인증작업을 처리하는것이 가장 좋은

velopert.com

 

반응형