TIL

authentication

너구리개발자 2024. 6. 20. 22:55

 

lucia, sqlite를 이용한 authentication 구현

import { Lucia } from 'lucia';
import { BetterSqlite3Adapter } from '@lucia-auth/adapter-sqlite';
import { cookies } from 'next/headers';
// 발신 응답에 포함된 쿠키에 접근할수있게 해줌
//  cookies 객체는 Next.js의 서버 사이드✅ 코드에서 쿠키에 접근할 때 사용
// cf) 클라이언트 사이드에서는 cookies를 직접적으로 사용할수없음

import db from './db';

const adapter = new BetterSqlite3Adapter(db, {
  user: 'users',
  session: 'sessions',
});

const lucia = new Lucia(adapter, {
  sessionCookie: {
    expires: false,
    attributes: {
      secure: process.env.NODE_ENV === 'production',
      // process.env.NODE_ENV: 이 환경 변수는 현재 애플리케이션의 실행 모드를 나타냅니다
      // development: 개발 모드
      // production: 배포 모드
      // test: 테스트 모드

      // secure 속성: true로 설정되면, 쿠키는 HTTPS 연결을 통해서만 전송됨
      // false로 설정되면, 쿠키는 HTTP, HTTPS 모두를 통해 전송될수있다
    },
  },
});

export async function createAuthSession(userId) {
  const session = await lucia.createSession(userId, {});
  //await 키워드를 사용하면 Promise가 resolve될 때까지 기다렸다가, 그 결과값을 반환하여 JavaScript 객체로 변환
  const sessionCookie = lucia.createSessionCookie(session.id);
  cookies().set(
    sessionCookie.name,
    sessionCookie.value,
    sessionCookie.attributes
  );
}
//async로 선언된 함수는 항상 Promise를 반환합니다

export async function verifyAuth() {
  const sessionCookie = cookies().get(lucia.sessionCookieName);

  if (!sessionCookie) {
    return {
      user: null,
      session: null,
    };
  }
  //첫번째 if문통과하면 sessionCookie 존재

  const sessionId = sessionCookie.value;

  if (!sessionId) {
    return {
      user: null,
      session: null,
    };
  }
  // 두번째 if문까지 통과하면 sessionCookie, sessionId 모두 존재

  const result = await lucia.validateSession(sessionId);
  // db에서 해당 sessionID를 찾아 세션이 유효한지 확인

  try {
    if (result.session && result.session.fresh) {
      const sessionCookie = lucia.createSessionCookie(result.session.id);
      cookies().set(
        sessionCookie.name,
        sessionCookie.value,
        sessionCookie.attributes
      );
    }
    if (!result.session) {
      const sessionCookie = lucia.createBlankSessionCookie();
      cookies().set(
        sessionCookie.name,
        sessionCookie.value,
        sessionCookie.attributes
      );
      // 세션을 찾지 못하는경우, 전송된 세션 쿠키를 삭제함(유효한 세션 쿠키가 아니기 때문)
    }
  } catch (error) {}

  return result;
}