세션 전략
사용자가 여러분의 애플리케이션을 방문할 때마다 매번 로그인할 필요가 없도록 하고 싶을 겁니다. 한 번 로그인한 후에는 애플리케이션이 사용자에 대한 일부 데이터를 저장하고, 다음에 방문할 때 이전에 하던 작업을 이어서 할 수 있도록 해야 합니다. 이를 세션이라고 합니다. Auth.js는 두 가지 주요 세션 전략을 지원합니다. JWT 기반 세션과 데이터베이스 세션이 바로 그것입니다.
두 세션 전략 모두 장단점이 있으므로, 애플리케이션의 요구 사항에 따라 적절히 평가해야 합니다.
메인 Auth.js 설정 파일에서 session.strategy
옵션을 사용해 세션 전략을 구성할 수 있습니다.
JWT 세션
Auth.js는 JSON Web Token (JWT)을 사용해 세션을 생성할 수 있습니다. 이는 데이터베이스 프로바이더가 설정되지 않은 경우 Auth.js의 기본 세션 전략입니다. 사용자가 로그인하면, JWT가 HttpOnly
쿠키로 생성됩니다. 쿠키를 HttpOnly
로 설정하면 클라이언트 측에서 JavaScript를 통해 쿠키에 접근하는 것을 방지할 수 있습니다(예: document.cookie
). 이는 공격자가 쿠키 값을 훔치는 것을 더 어렵게 만듭니다. 또한, JWT는 서버만 알고 있는 비밀 키로 암호화됩니다. 따라서 공격자가 쿠키에서 JWT를 훔치더라도 이를 복호화할 수 없습니다. 짧은 만료 시간과 결합하면, JWT는 세션을 생성하는 안전한 방법이 됩니다.
사용자가 로그아웃하면, Auth.js는 쿠키에서 JWT를 삭제하여 세션을 종료합니다.
장점
- JWT를 세션으로 사용하면 세션을 저장하기 위해 데이터베이스가 필요하지 않아 더 빠르고 저렴하며 확장이 쉽습니다.
- 이 전략은 추가적인 데이터베이스나 서비스를 관리할 필요가 없어 리소스 사용이 적습니다.
- 생성된 토큰을 사용하면 동일한 도메인 내의 서비스와 API 간에 정보를 전달할 수 있으며, 포함된 정보를 검증하기 위해 데이터베이스에 접근할 필요가 없습니다.
- JWT를 사용하면 사이트에서 실행되는 타사 자바스크립트에 노출되지 않도록 정보를 안전하게 저장할 수 있습니다.
단점
- 데이터베이스 세션은 데이터베이스와의 왕복이 필요하므로, 연결이나 데이터베이스가 이를 감당하지 못한다면 규모가 커질수록 속도가 느려질 수 있습니다.
- 많은 데이터베이스 어댑터가 아직 Edge와 호환되지 않아, 더 빠르고 저렴하게 세션을 가져오는 것이 어려울 수 있습니다.
- 데이터베이스 설정은 무상태 JWT 전략에 비해 더 많은 노력이 필요하며, 추가 서비스 관리가 필요합니다.
데이터베이스 세션
JWT 세션 전략 외에도, Auth.js는 데이터베이스 세션도 지원합니다. 이 경우, 로그인 후 사용자 데이터가 포함된 JWT를 저장하는 대신, Auth.js가 데이터베이스에 세션을 생성합니다. 그런 다음 세션 ID가 HttpOnly
쿠키에 저장됩니다. 이는 JWT 세션 전략과 유사하지만, 쿠키에 사용자 데이터를 저장하는 대신 데이터베이스의 세션을 가리키는 암호화된 값만 저장합니다. 따라서 사용자 세션에 접근하려고 할 때마다 데이터베이스에서 데이터를 쿼리하게 됩니다.
사용자가 로그아웃하면, 데이터베이스에서 세션이 삭제되고 쿠키에서도 세션 ID가 삭제됩니다.
장점
- 데이터베이스 세션은 서버 측에서 언제든지 수정할 수 있습니다. 따라서 JWT 전략 등을 사용할 때 구현하기 어려울 수 있는 기능(예: “모든 기기에서 로그아웃” 또는 동시 로그인 제한)을 더 쉽게 구현할 수 있습니다.
- Auth.js는 사용하는 데이터베이스 타입에 대해 특별한 제한을 두지 않습니다. 공식 데이터베이스 어댑터 목록이 제공되지만, 필요에 따라 직접 어댑터를 구현할 수도 있습니다.