비밀번호 암호화 및 회원가입 완료:
PasswordEncoder (e.g., BCryptPasswordEncoder)를 사용하여 비밀번호를 단방향으로 해시(Hash)한 후, 암호화된 값을 데이터베이스에 저장합니다.JWT(JSON Web Token) 기반 로그인:
PasswordEncoder의 matches() 메서드를 통해 비교합니다.토큰 검증 필터 (JWT Authentication Filter):
Authorization: Bearer ...)에 담아 보냅니다.인증 기반 데이터 처리:
회원가입 및 로그인 플로우 완성:
action 함수를 사용하여 서버에 로그인 요청을 보내고, 성공 시 발급받은 JWT를 브라우저의 안전한 저장소(localStorage)에 저장합니다. 실패 시에는 서버로부터 받은 에러 메시지를 사용자에게 피드백합니다.loader를 활용한 라우트 가드 (Route Guard):
loader는 컴포넌트가 렌더링되기 전에 실행되므로, 이 단계에서 사용자의 인증 상태를 확인하여 특정 라우트에 대한 접근을 제어할 수 있습니다.loader 함수에서, 브라우저에 저장된 토큰의 유효성을 확인합니다. 토큰이 없거나 유효하지 않으면, redirect() 함수를 반환하여 사용자를 로그인 페이지로 강제 이동시킵니다.전역 상태 관리 및 데이터 전파:
loader: 최상위(Root) 라우트의 loader에서 사용자의 로그인 상태(토큰 유무)를 확인하고, 그 결과를 반환합니다.useRouteLoaderData Hook: 자식 컴포넌트들은 useRouteLoaderData Hook을 사용하여 부모(루트) 라우트의 loader가 반환한 데이터를 쉽게 조회할 수 있습니다. 이를 통해 앱 전반에서 "현재 로그인된 상태인가?"를 쉽게 파악하고, 조건부로 UI(e.g., 로그인/로그아웃 버튼)를 렌더링할 수 있습니다.로그아웃 처리:
action 함수는 브라우저에 저장된 토큰을 삭제하고, 사용자를 홈이나 로그인 페이지로 redirect 시키는 역할을 합니다.인증된 API 요청:
action 함수를 통해 로그인/로그아웃 로직을 처리하고, 발급받은 JWT를 브라우저에 저장하여 인증 상태를 유지합니다.loader를 라우트 가드로 활용하여, 인증되지 않은 사용자의 페이지 접근을 사전에 차단했습니다.loader와 useRouteLoaderData Hook을 통해 앱 전반에서 전역적인 인증 상태를 효율적으로 공유하고, 이에 따라 동적인 UI를 제공하는 구조를 완성했습니다.