Files
eg-qna/docs/OIDC_trouble_shooting.md
Lectom C Han dd89e5fc90
Some checks failed
Deploy to Production / Deploy (push) Failing after 4s
svelt kit test
2025-07-25 14:43:32 +09:00

4.6 KiB

OIDC 인증 구현 트러블슈팅 (svelte-check)

pnpm run check 실행 시 발생한 타입 에러들에 대한 요약 및 해결 과정 기록. 모든 문제는 최종적으로 해결되었습니다.


1-6. src/lib/server/auth.ts 관련 타입 오류

  • 파일: src/lib/server/auth.ts
  • 오류 요약:
    1. unstorage 및 관련 어댑터 import 오류
    2. Lucia v3 생성자에 env 속성 사용 오류
    3. getUserAttributes 콜백의 data 타입 추론 오류 ({})
    4. 더미 어댑터의 타입이 Adapter 인터페이스와 불일치
  • 원인: Lucia v3의 API와 타입 시스템에 대한 이해 부족. 데이터베이스 의존성을 제거하는 과정에서 unstorage 어댑터를 잘못 사용하려고 시도함.
  • 해결 상태: 완료
  • 해결책:
    1. unstorage 및 관련 패키지 의존성을 제거했습니다.
    2. 데이터베이스 없이 OIDC 흐름을 테스트하기 위해, Lucia v3의 Adapter 인터페이스를 직접 구현하는 더미 인메모리 어댑터auth.ts 내에 작성했습니다.
    3. 이 더미 어댑터는 Map 객체를 사용하여 세션과 사용자 정보를 메모리에 임시 저장합니다.
    4. Lucia 생성자에서 v2 방식의 env 속성을 제거하고, Adapter 인터페이스에 맞게 setUser와 같은 불필요한 메서드를 제거했습니다.
    5. declare module 'lucia'를 사용하여 DatabaseUserAttributes 타입을 명시적으로 정의함으로써, getUserAttributes의 타입 추론 오류를 해결했습니다.

7. hooks.server.tshandleRequest 오류

  • 파일: src/hooks.server.ts
  • 오류 메시지: Property 'handleRequest' does not exist on type 'Lucia<...>'
  • 원인: lucia.handleRequest()는 Lucia v2에서 사용하던 방식입니다. v3에서는 세션 유효성 검사와 쿠키 관리를 직접 처리해야 합니다.
  • 해결 상태: 완료
  • 해결책: Lucia v3의 공식 문서에 따라 hooks.server.tshandle 함수를 수정했습니다. 이제 모든 요청에서 event.cookies를 통해 세션 ID를 가져오고, lucia.validateSession()으로 유효성을 검증합니다. 검증 결과에 따라 event.locals.userevent.locals.session을 설정하고, 필요한 경우 세션 쿠키를 새로 생성하거나 비우는 로직을 추가했습니다.

8. arctic 모듈 선언 오류

  • 파일: src/routes/login/callback/+page.server.ts
  • 오류 메시지: Cannot find module 'arctic' or its corresponding type declarations.
  • 원인: arctic 패키지가 설치되지 않았습니다.
  • 해결 상태: 완료
  • 해결책: pnpm install arctic 명령을 실행하여 의존성을 추가했습니다.

9. logout 라우트의 redirect 함수 오류

  • 파일: src/routes/logout/+page.server.ts
  • 오류 메시지: Expected 2 arguments, but got 3.
  • 원인: SvelteKit의 redirect 함수 API가 변경되었습니다. 더 이상 세 번째 인자로 헤더(쿠키 포함)를 전달할 수 없습니다.
  • 해결 상태: 완료
  • 해결책: redirect 함수에서 헤더 인자를 제거하고, 대신 event.cookies.set()을 사용하여 로그아웃 시 세션 쿠키를 삭제하도록 로직을 변경했습니다.

추가 해결: event.locals 타입 오류

  • 파일: src/app.d.ts, src/routes/**/+*.server.ts
  • 오류 메시지: Property 'user' does not exist on type 'Locals'.
  • 원인: hooks.server.ts에서 event.locals.userevent.locals.session을 할당했지만, SvelteKit의 전역 타입 정의 파일(app.d.ts)에 해당 속성이 선언되지 않았습니다.
  • 해결 상태: 완료
  • 해결책: src/app.d.ts 파일의 App.Locals 인터페이스에 user: import('lucia').User | null;session: import('lucia').Session | null;를 추가하여 전역 타입을 확장했습니다.

추가 해결: 프론트엔드 컴포넌트 타입 오류

  • 파일: src/routes/+layout.svelte, src/routes/+page.svelte
  • 오류 메시지: Property 'session' does not exist on type '{ user: User | null; }'.
  • 원인: 서버 사이드(+layout.server.ts)에서 data로 전달하는 객체의 구조를 { session }에서 { user }로 변경했으나, 프론트엔드 컴포넌트에서는 여전히 data.session을 참조하고 있었습니다.
  • 해결 상태: 완료
  • 해결책: +layout.svelte+page.svelte 파일에서 data.session을 참조하는 모든 코드를 data.user를 참조하도록 수정했습니다.