토큰 기반 인증은 모던 웹서비스에서 정말 많이 사용되고 있는 인증 방법이다.

토큰 기반 인증 시스템의 탄생 배경을 이해하기 위해 과거의 서버 기반 인증 시스템을 살펴보자.


서버 기반 인증

기존의 인증 시스템은 서버 측에서 유지하고 있는 세션 정보를 가지고 사용자 인증을 했다.

서버는 메모리 | 디스크 | DB 시스템을 이용해 유저들의 세션을 저장했다.

 

해당 인증 방법은 크게 3가지의 문제점이 있었는데,

  1. 세션
    일반적으로 서버는 세션이라는 정보를 메모리에 저장하는데, 유저가 많아지면 많아질수록 메모리의 부하가 가중된다.

  2. 확장성
    세션을 사용하게되면 서버를 확장하기가 어려워진다. 분산된 시스템을 설계하는게 불가능하지는 않지만 과정이 매우 복잡하다.

  3. CORS ( Cross-Origin Resource Sharing )
    웹 애플리케이션에서 세션을 관리하기 위해 사용되는 쿠키는 단일 또는 서브 도메인에서만 사용이 가능하다.
    쿠키를 여러 도메인에서 관리하는 것은 번거로운 일이다.

 

토큰 기반 인증

토큰 기반 인증은 아래와 같은 흐름으로 진행된다.

  1. 유저가 ID와 PW로 로그인을 한다.
  2. 서버에서 해당 계정 정보를 검증한 후, 정확하다면 서버는 유저에게 signed 토큰을 발급해준다.
    ( signed 토큰이란 서버에서 발급한 토큰이라는걸 증명할 수 있는 signature를 가진 토큰이라는 의미. )
  3. 클라이언트는 서버로부터 발급받은 토큰을 저장해두고, 서버에 요청을 보낼 때마다 해당 토큰을 같이 보낸다.
  4. 서버는 토큰을 검증하고, 요청에 응답한다.

 

토큰은 아래의 특징을 가진다.

  1. 무상태성( Stateless ) & 확장성( Scalability )  
    토큰은 클라이언트 측에 저장되기 때문에 서버는 완전히 Stateless하며, 클라이언트-서버간의 연결고리가 없기 때문에 확장에 유리하다.
    만약 사용자 정보가 서버측에 저장된다면 서버를 확장하여 분산처리할 경우, 해당 사용자가 처음 로그인했었던 서버에서만 요청을 받도록 설정을 해줘야한다. 하지만 토큰을 사용하면 어떠한 서버로 요청이 들어와도 문제가 없다.

  2. 보안성
    클라이언트가 서버로 요청을 보낼 때 더이상 쿠키를 사용하지 않으므로, 쿠키 사용에 의한 취약점이 사라진다.
    하지만 반대로, 토큰에 의한 취약점이 있을테니 거기에는 대비를 해야겠지 ?

  3. 확장성( Extensibility )
    시스템의 확장성을 의미하는 Scalability와 달리 Extensibility는 로그인 정보가 사용되는 분야의 확장을 의미한다.
    토큰 기반의 인증 시스템에서는 토큰에 선택적인 권한만 부여하여 발급할 수 있다.

  4. 여러 플랫폼 및 도메인
    서버 기반 인증 시스템의 문제점 중 하나인 CORS를 해결할 수 있는데, 애플리케이션과 서비스의 규모가 커지면 여러 디바이스를 호환시키고 더 많은 종류의 서비스를 제공하게된다. 토큰을 사용하면 어떤 디바이스, 어떤 도메인에서도 토큰의 유효성 검사를 진행한 후에 요청을 처리할 수 있게 된다.

 

토큰으로는 JSON 포맷을 사용하는 JWT( Json Web Token )를 주로 사용한다.

 

 

참고자료

[1] https://velopert.com/2350

[2] https://mangkyu.tistory.com/55

 

 

'Web' 카테고리의 다른 글

[Web] HTTP Protocol과 메소드/상태 코드  (0) 2017.04.14