시스템을 구현하기 위해서 JWT (JSON Web Token)을 사용한다. JWT 는 데이터가 JSON 형식으로 이루어진 토큰을 의미하며, 두 개체가 서로 안전하게 정보를 주고받을 수 있도록 웹 표준으로 정의된 기술이다.
사용자의 로그인 상태를 서버에서 처리하기 위한 방식은 두개이다.
서버가 사용자가 로그인 중임을 기억하고 있는 것이다.
사용자가 로그인을 하면, 서버는 세션 저장소에 사용자의 정보를 조회하고 세션 id 를 발급한다. (발급된 id는 주로 브라우저의 쿠키에 저장)
사용자가 다른 요청(Request)을 보낼 때마다 서버는 세션 저장소에서 세션을 조회한 후 로그인 여부를 결정하여 작업을 처리하고 응답(Response)을 한다.(세션 저장소는 주로 메모리, 디스크, 데이터베이스 등을 사용한다.)
단점 : 서버를 확장하기 번거롭다. 만약 서버의 인스턴스가 여러개 된다면, 모든 서버끼리 같은 세션을 공유해야 하므로 세션 전용 데이터베이스를 만들어야 할 뿐 아니라 신경 써야할 것이 많다.
token은 로그인 이후, 서버가 만들어 주는 문자열이다. 해당 문자열 안에는 사용자의 로그인 정보가 들어가 있고, 해당 정보가 서버에서 발급되었음을 증명하는 서명이 들어 있다.
서버에서 만들어 준 token은 '서명' 이 있기에 무결성 (정보가 변경되거나 위조되지 않았음을 의미하는 성질)이 보장된다.
사용자가 로그인을 하면, 서버에서 사용자에게 해당 사용자의 정보를 지니고 있는 토큰을 발급해준다.
추후, 사용자가 다른 API를 요청하게 될때 발급받은 토큰과 함께 요청하게 된다.
그러면, 서버는 해당 토큰이 '유효한지 검사' 하게 되고 결과에 따라 작업을 처리하고 응답(response) 하게 된다.
장점 : 서버에서 사용자의 로그인 정보를 기억하기 위해 사용하는 리소스가 적다는 것이다. 사용자 쪽에서 로그인 상태를 지닌 토큰을 가지고 있으므로 서버의 확장성이 매우 높다. 서버의 인스턴스가 여러 개로 늘어나도 서버끼리 사용자의 로그인 상태를 공유할 필요가 없는 것이다.
따라서, 토큰 기반 인증 시스템을 사용하여, 로그인 인증을 진행할 것이다. 진행 순서는