[Node.js] JWT / 세션기반, 토큰기반 인증 시스템
✅ JWT
- JWT는 JSON Web Token의 약자로,
- 데이터가 JSON으로 이루어져 있는 토큰 의미
- 두 개체가 서로 안전하게 정보를 주고받을 수 있도록 웹 표준으로 정의된 기술
🔸 세션 기반 인증 vs. 토큰 기반 인증
- 사용자의 로그인 상태를 서버에서 처리하는 데 사용할 수 있는 대표적 두 가지 인증방식
🔹 세션 기반 인증 시스템
- 세션기반 인증 시스템을 만드는 것은 서버가 사용자가 로그인 중임을 기억하고 있다는 뜻
- 사용자가 로그인하면, 서버는 세션 저장소에 사용자의 정보를 조회하고 세션 id 발급
- 발급된 id는 주로 쿠키에 저장
- 이후 사용자가 다른 요청을 보낼 때마다 서버는 세션 저장소에서 세션을 조회한 후 로그인 여부를 결정하여 작업을 처리하고 응답
- 세션 저장소는 주로 메모리, 디스크, DB 등을 사용
- 하지만 서버 확장이 번거롭다는 단점
- 서버의 인스턴스가 여러 개가 된다면 모든 서버끼리 같은 세션을 공유해야 하므로,
- 세션 전용 DB를 만들어야 할 뿐 아니라 신경 써야 할 것도 많음
🔹 토큰 기반 인증 시스템
- 토큰은 로그인 이후 서버가 만들어 주는 문자열
- 해당 문자열 안에는 사용자의 로그인 정보와 해당 정보가 서버에서 발급되었음을 증명하는 서명이 들어있음
- 서명 데이터는 해싱 알고리즘을 통해 만들어지는데,
- 주로 HMAC SHA256, RSA SHA256 알고리즘 사용
- 토큰은 서명이 있기 때문에 무결성이 보장됨
- 시스템 흐름은
- 사용자가 로그인 시 서버에게 토큰을 발급받고,
- 사용자는 추후 다른 API 요청시 토큰과 함께 요청하게 됨
- 서버는 토큰 유효성 검사를 하고, 결과에 따라 작업을 처리하고 응답
- 서버 확장성이 높다는 장점
- 서버에서 사용자 로그인 정보를 기억하기 위해 사용하는 리소스가 적음
- 사용자 쪽에서 토큰을 가지고 있으므로 서버의 확장성이 높음
- 서버 인스턴스가 여러 개로 늘어나도 서버끼리 사용자의 로그인 상태를 공유하고 있을 필요가 없음!!