4.6 KiB
4.6 KiB
OIDC 인증 구현 트러블슈팅 (svelte-check)
pnpm run check 실행 시 발생한 타입 에러들에 대한 요약 및
해결 과정 기록. 모든 문제는 최종적으로 해결되었습니다.
1-6.
src/lib/server/auth.ts 관련 타입 오류
- 파일:
src/lib/server/auth.ts - 오류 요약:
unstorage및 관련 어댑터 import 오류- Lucia v3 생성자에
env속성 사용 오류 getUserAttributes콜백의data타입 추론 오류 ({})- 더미 어댑터의 타입이
Adapter인터페이스와 불일치
- 원인: Lucia v3의 API와 타입 시스템에 대한 이해
부족. 데이터베이스 의존성을 제거하는 과정에서
unstorage어댑터를 잘못 사용하려고 시도함. - 해결 상태: 완료
- 해결책:
unstorage및 관련 패키지 의존성을 제거했습니다.- 데이터베이스 없이 OIDC 흐름을 테스트하기 위해, Lucia v3의
Adapter인터페이스를 직접 구현하는 더미 인메모리 어댑터를auth.ts내에 작성했습니다. - 이 더미 어댑터는
Map객체를 사용하여 세션과 사용자 정보를 메모리에 임시 저장합니다. - Lucia 생성자에서 v2 방식의
env속성을 제거하고,Adapter인터페이스에 맞게setUser와 같은 불필요한 메서드를 제거했습니다. declare module 'lucia'를 사용하여DatabaseUserAttributes타입을 명시적으로 정의함으로써,getUserAttributes의 타입 추론 오류를 해결했습니다.
7.
hooks.server.ts의 handleRequest 오류
- 파일:
src/hooks.server.ts - 오류 메시지:
Property 'handleRequest' does not exist on type 'Lucia<...>' - 원인:
lucia.handleRequest()는 Lucia v2에서 사용하던 방식입니다. v3에서는 세션 유효성 검사와 쿠키 관리를 직접 처리해야 합니다. - 해결 상태: 완료
- 해결책: Lucia v3의 공식 문서에 따라
hooks.server.ts의handle함수를 수정했습니다. 이제 모든 요청에서event.cookies를 통해 세션 ID를 가져오고,lucia.validateSession()으로 유효성을 검증합니다. 검증 결과에 따라event.locals.user와event.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.user와event.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를 참조하도록 수정했습니다.