본문 바로가기
next.js

NextAuth.js, Lucia auth, 토큰과 세션의 특징, 라이브러리 선택 시 유의할 점

by DevPearl 2024. 9. 5.

짧은 지식으로 인해 글의 신뢰성이 높지 않습니다. 정확한 내용은 공식문서를 참고해 주세요.

 

목차)

1. 서론

2. 토큰, 세션 언제 좋을까

3. NextAuth.js 와 Lucia Auth의 특징 

4. 결론

 

1. 서론

이번 글은 Next.js 인증 구현과정에서 라이브러리를 선택하며, 느낀 점에 대한 개인적인 감상입니다.

 

 

Next.js로 인증을 구현해야 하는 상황이었다. 토큰 재발급 로직을 직접 구현할 것인지 라이브러리를 사용할 것인지 찾아보다가 커뮤니티에 질문을 올렸는데, 

여러 답변을 보고 라이브러리 선택 시 유의 사항과 토큰과 세션이 적합한 상황에 대해 배울 수 있었다. 

https://www.reddit.com/r/nextjs/comments/1f31n7z/should_i_use_nextauth_or_implement_jwt_and/

 

From the nextjs community on Reddit

Explore this post and more from the nextjs community

www.reddit.com

 

 

2. 토큰, 세션 언제 좋을까

 

세션은 사용자의 상태를 서버에서 관리하는 방식(세션을 업데이트하거나 무효화할 경우 유리),

토큰은 토큰에 암호화된 사용자 정보를 담아 주고 받는 무상태로 세션관리 방식(복호화는 시크릿 키가 있어야 함)

이라고 세 달전 면접을 위해 외운 지식이 다였는데 이번에 각 방법이 더 적합한 상황들이 있음을 배웠다.

 

세션이 유리할 경우: 

  • 보안에 유의 해야 하는 경우, 즉 서버에서 로그인을 invalidate 해야 하는 상황이 많을 경우에 유리.
    같은 상황에 토큰을 사용한다면 따로 블랙리스트 테이블을 request마다 DB 테이블을 조회해야 해서 비효율적.
  •  세션에 많은 정보를 담아야 하는 경우. JWT가 커지면 네트워크에도 부담이 가고 쿠키가 보통 4kb 제한이 있어 쿠키에 저장하는데 제약이 생길 수 있음. 

 

토큰이 유리한 경우: 

  • 마이크로 서비스 아키텍처인 경우, 3rd party API 요청을 많이 보내는 경우 유리.
    마이크로 서비스 등 각 서비스가 독립적으로 동작하는 경우, 무상태 통신의 토큰이 적합(상태관리의 부담 줄이고 간단히 토큰으로 인증가능). 3rd party API의 경우 해당 API에 대한 인증 정보가 포함된 토큰을 함께 보내 인증.

토큰 유의할 점:

  • 리프레시 토큰이 탈취당할 경우 사용자의 정보가 유출될 수 있어 추가로 csrf 토큰 또는 리프레시 토큰을 DB에 저장하는 등의 추가적 보안사항도 고려. 

3. NextAuth.js 와 Lucia Auth의 특징 

NextAuth의 특징

  • OAuth, 이메일/비밀번호, 인증 코드 등 다양한 인증 방식 지원
  • 토큰과 DB세션 중 세션관리 방법 선택 가능
  • NextAuth.js는 여러 데이터베이스와의 통합을 위한 어댑터(Adapter) 제공
  • Next.js 커뮤니티의 가장 크고 많이 사용되는 인증 라이브러리이다
  • 코드가 추상화 되어 있어 커스텀이 어렵다
  • 문서가 개인적으로 친절하지 않다고 느꼈다(그런 평가가 많았다)
  • Password based 로그인에서 persist session을 지원하지 않음.
  • Password based 로그인에서 jwt 토큰 refresh logic 직접 구현해야 함

Lucia Auth의 특징

  • 가볍다
  • 자체 OAuth를 내장하고 있지는 않음(Arctic과 함께 OAuth 구현)
  • glue코드가 적고 덜 추상화 돼있다. 즉 코드가 겉으로 드러나 있어 copy paste 해서 커스텀하기 유리하다
  • 세션 방식
  • Password based 로그인도 세션 자동 갱신을 지원한다
  • NextAuth보다 적은 사용자

 

4. 결론

개인적으로 안정성을 추구하며, 다양한 OAuth인증을 함께 하고 거의 커스텀하지 않는다면 NextAuth.js를 사용할 것 같다.(refresh token발급을 하는 백엔드 코드를 짜야하고 문서가 불친절하다고 느꼈지만...)

NextAuth를 사용할 경우 버전이 바뀔 때 얼마나 많이 코드를 변경해야 할지도 고려해야 할 것 같다.

 

반대로 작은 규모에서 password based 로그인만 구현한다면, 혹은 OAuth를 병행하더라도 경량화된 라이브러리를 커스텀해서 사용한다면 Lucia Auth를 사용할 것 같다.(Lucia Auth에서는 Arctic과 함께 OAuth 구현하는 것을 친절히 안내하고 있다. Lucia Auth의 문서는 참 읽기 쉽게 잘 나와있다고 생각한다.)

 

NextAuth.js로 pw based로그인만 구현해도 이점이 있긴하다. csrf 토큰 발급으로 인한 보안, jwt콜백에서 토큰갱신, 미들웨어에서 session 의 user로 검증이라는 이점이 있다.

 

오늘 아침에 프론트엔드 팟캐스트를 들었는데 주제가 framework였다. 흘려듣다가 "That's where the taste comes in"이라는 말이 딱 꽂혔다. 다양한 라이브러리와 프레임워크에서 glue 코드와 추상화로 편리함을 제공하지만, 항상 장단점을 고려하여 나의 현재 상황에 가장 필요한 기술을 선택해야 함을 다시 한번 느낀다.

 

https://next-auth.js.org/

 

NextAuth.js

Authentication for Next.js

next-auth.js.org

https://lucia-auth.com/getting-started/

 

Getting started

Lucia is an open source auth library that abstracts away the complexity of handling sessions.

lucia-auth.com