JWT - 토큰기반인증 #1 장점과 작동원리

토큰기반인증은 요즘 가장 핫한 인증개념이라고 할 수 있다.
어떤 장점이 있는지 알아보자.
장점
Stateless 서버
자주 사용하고 많이들 알고 있을 세션-쿠키의 Stateful 서버방식과 다르게 토큰 방식은 Stateless로써 상태를 지니고 있을 필요가 없다.
즉, 서버는 클라이언트의 request에만 의존하여 서비스를 제공하면 되고 잘못된 상태를 저장할 위험이나 그로인한 오류에서 벗어날 수 있다.
조금 더 자세히 이야기해 보자.
HTTP 프로토콜은 상태를 보관할 수 없기 때문에 상태를 보관하기 위해 세션과 쿠키를 사용한다. 서버에서 세션에 상태를 보관하고, 브라우저에서는 쿠키를 놓는다.
쿠키는 브라우저의 메모리에 보관하고(디스크에 저장한게 아니라 브라우저가 꺼지면 지워진다.)
이 때 세션과 쿠키의 상태를 비교하며 클라이언트와 서버가 인터액션하게 되는데, 문제가 몇가지 생긴다.
사실 그 문제들은 Stateful 서버의 문제라고 할 수 있고, 토큰기반인증의 장점은 거의 Stateless서버의 장점이라고 할 수 있다.
CSRF(Cross-Site Request Forgery,XSRF)
사이트간 요청 위조. 예를들어 이미 쿠키가 사용자 정보를 가지고 있기때문에 사용자가 사이트를 벗어나도 공격자에게 노출될 수 있다. 공격자가 비밀번호 수정 URL로 유도하여 멋대로 비밀번호를 바꾸어버린다면 쿠키가 있기 때문에 서버는 신뢰하고 작업을 진행하는 것이다. 토큰 기반인증에서는 헤더 내에 토큰이 포함되어 CSRF를 방지할 수 있다.
CORS(Cross-Origin Resource Sharing)
쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있기 때문에 여러 도메인에서 관리하기 어렵다. 하지만 토큰기반인증은 토큰만 유효하다면 어디서든 작동할 수 있다.
서버 확장
프로젝트가 커져서 서버가 여러대 생겼다고 했을 때 서버1에 세션이 저장되어 서버2에 간 호출은 unauthorized가 날 수 있다. sticky세션(같은 서버에 세션을 계속 연결시키는 방식)을 사용하여 해결할 수 있지만, 이런걸 고려하지 않아도 토큰 기반방식은 자연스럽게 해결된다.
다른 어플리케이션과의 인터액션
OAuth에 대해서 들어보았다면 다른 앱에서도 페이스북 등등의 서비스를 통해 로그인하는 방법에 대해서도 알것이다. 페이스북이 토큰기반인증방식을 사용하기 때문에 다른 서비스에서도 접근 할 수 있는것이다.
작동원리
클라이언트가 로그인 요청을 한다.
서버에서 로그인 정보를 검증한다.
검증이 완료되면 서버는 클라이언트에게 signed토큰을 발급한다.
클라이언트는 토큰을 저장해두고 서버에 요청할 때마다 토큰을 함께 전달한다.
서버는 토큰을 검증하고 응답한다.