1. 인증 및 권한 관리
- 인증(Authentication): 사용자가 시스템에 접근하기 위해 본인의 신원을 증명하는 과정입니다. 주로 ID/비밀번호를 통해 이루어지며, 성공 시 JWT(Access Token)를 발급받아 사용합니다.
- 권한 관리(Authorization): 인증된 사용자가 시스템 내에서 어떤 자원에 접근할 수 있는지를 결정하는 과정입니다. 일반 사용자와 관리자 권한을 구분하여, 민감한 기능에 대한 접근을 제한합니다.
2. 클라이언트-서버 구조
- Request Access Token: 사용자가 로그인할 때, 클라이언트는 서버에 ID/비밀번호를 보내고, 서버는 이를 검증하여 유효한 JWT(Access Token)를 발급합니다.
- Verify Access Token: 클라이언트는 이후 요청에서 Access Token을 서버로 전송하여, 서버는 이 토큰이 유효한지 확인합니다. 유효하다면 요청을 처리하고, 유효하지 않다면 토큰 만료 또는 무효화 처리(로그아웃)합니다.
3. 토큰 관리
- 로컬 스토리지(Local Storage): 클라이언트는 Access Token을 로컬 스토리지에 저장하여, 페이지 리로드나 새로고침 시에도 인증 상태를 유지합니다.
- 토큰 만료 처리: 클라이언트는 페이지 이동이나 중요한 액션(예: 관리자 페이지 접근) 시 토큰의 유효성을 확인합니다. 만료된 토큰이 발견되면 사용자는 자동으로 로그아웃되거나, 토큰 갱신이 가능하면 새 토큰을 발급받아 저장합니다.
4. 라우팅 구조
- Public Routes: 로그인 페이지, 회원가입 페이지 등 인증이 필요 없는 페이지입니다. 누구나 접근할 수 있습니다.
- Protected Routes: 인증이 필요한 페이지들입니다. 인증되지 않은 사용자는 접근할 수 없으며, 로그인 페이지로 리다이렉트됩니다.
5. 상태 관리
- 전역 상태 관리: 인증 상태와 사용자 권한을 중앙에서 관리합니다. 이를 위해 Jotai나 Context API를 사용할 수 있습니다. 전역 상태는 현재 사용자의 인증 여부와 관리자 권한을 유지하며, 필요 시 UI에서 이 상태를 참조하여 접근을 제어합니다.
- 상태 동기화: 로컬 스토리지에 저장된 토큰을 기반으로 초기 인증 상태를 설정합니다. 상태가 변경될 때(로그인, 로그아웃 등) 이를 로컬 스토리지와 동기화하여 페이지를 새로고침해도 인증 상태가 유지되도록 합니다.
6. 보안 고려사항
- 토큰 보호: Access Token은 민감한 정보이므로, XSS 공격에 취약한 로컬 스토리지 대신 httpOnly 쿠키를 사용할 수도 있습니다. 이 경우 보안이 강화되지만, 쿠키 기반의 추가적인 서버 설정이 필요합니다.
- CSRF 보호: 쿠키를 사용할 경우 CSRF 공격에 대비하기 위해 CSRF 토큰을 활용할 수 있습니다.
7. UX 고려사항
- 자동 로그아웃: 토큰이 만료되었거나 무효화된 경우, 사용자에게 알림을 제공하고 자동으로 로그아웃 처리합니다.
- 토큰 갱신: 장시간 로그인 상태를 유지하려는 사용자에게는 자동 토큰 갱신 기능을 제공하여, 만료 전에 새 토큰을 발급받고 기존 세션을 연장할 수 있도록 합니다.
8. 관리자 권한 운영
- 권한 부여 및 철회: 관리자 권한은 사용자 인증 후 서버에서 부여하거나 철회할 수 있습니다. 서버에서 관리자 권한을 부여받은 사용자는 클라이언트의 전역 상태(Jotai나 Context API)에서 isAdmin 플래그를 활성화합니다.
- 관리자 페이지 UI 제어: isAdmin 상태에 따라 관리자 전용 UI 컴포넌트를 렌더링하거나 숨길 수 있습니다. 예를 들어, 관리자 메뉴를 숨기거나 접근을 제한하는 등의 처리를 할 수 있습니다.
9. 리다이렉션 처리
- 로그인 후 리다이렉션: 인증이 필요한 페이지에 접근하려다 로그인 페이지로 리다이렉트된 경우, 로그인 후 원래의 페이지로 다시 이동시키는 기능을 제공합니다.
- 권한 부족 시 리다이렉션: 일반 사용자가 관리자 페이지에 접근하려 하면, 관리자 권한이 없음을 알리고 일반 사용자 페이지로 리다이렉트합니다.