유저 시스템 기획

본 프로젝트에서는 게임과 긴밀하게 연결된 유저 정보를 체계적이고 안전하게 관리할 수 있는 유저 시스템을 구축하였다. 단순히 회원가입과 로그인을 처리하는 데 그치지 않고, 게임 플레이와 연동되는 정보 저장, 인증 보안 강화, 개인정보 보호, 그리고 계정 삭제 시의 후처리까지 폭넓은 기능을 포함하도록 설계되었다. 이를 통해 사용자에게 신뢰할 수 있는 서비스 환경을 제공하는 동시에, 개발자의 입장에서도 유지보수와 확장에 용이한 구조를 지향하였다.

1. 회원가입

회원가입은 /api/accounts 경로를 통해 이루어진다. 사용자는 사용자명, 비밀번호, 이메일을 입력하여 가입을 요청하게 되며, 서버는 이를 수신하여 일련의 절차를 거친다. 먼저, 이메일 형식이 유효한지, 동일한 사용자명이 이미 존재하는지 등 기본적인 유효성 검사를 수행한다. 그 후 비밀번호는 BCrypt 알고리즘을 활용하여 안전하게 암호화되며, 이를 포함한 전체 사용자 정보는 데이터베이스에 저장된다.

가입이 완료되면, 서버는 사용자에게 고유 ID와 함께 등록된 사용자명, 이메일 정보를 반환한다. 이 과정은 보안에 중점을 두고 설계되었으며, 특히 비밀번호와 같은 민감한 정보는 절대 평문으로 저장되지 않도록 주의하였다.

2. 로그인 및 인증

로그인은 /api/accounts/login을 통해 처리된다. 사용자가 입력한 정보는 데이터베이스에 저장된 값과 비교되며, 이때 역시 BCrypt 기반의 해시 비교를 통해 안전하게 비밀번호를 검증한다. 인증에 성공하면 현재는 간단한 메시지를 반환하지만, 추후에는 JWT 기반의 토큰을 발급하여 인증 상태를 유지할 수 있도록 구조가 확장될 계획이다.

Access Token과 Refresh Token을 함께 발급하여 일정 시간 동안 로그인 상태를 유지하게 하고, 만료 시 Refresh Token을 통해 재발급을 요청하는 방식으로 사용자 경험을 개선할 수 있다. 인증 실패 시에는 상황에 따라 401 또는 404 상태 코드를 통해 적절한 피드백을 제공한다.

3. 인증 실패 및 예외 처리

일관된 에러 응답을 제공하기 위해 CustomAuthenticationEntryPoint를 구현하였다. 이 컴포넌트는 만료된 토큰, 잘못된 자격 증명, 비정상적인 요청 등 다양한 인증 실패 상황을 감지하고, JSON 형식의 통일된 에러 메시지를 반환한다.

예를 들어, 토큰이 만료된 경우에는 "A001 - 만료된 토큰", 유효하지 않은 토큰일 경우에는 "A002 - 유효하지 않은 토큰" 등의 방식으로 에러 코드와 메시지를 함께 전달하여, 클라이언트가 문제 상황을 명확히 파악하고 대응할 수 있도록 설계되었다.

4. 유저 정보 조회 및 수정

계정 정보는 기본적으로 Accounts라는 엔티티에 저장되며, 인증 및 서비스 접근 권한을 판단하는 기준으로 사용된다. 한편, 실제 게임 내 플레이와 관련된 정보는 별도의 Players 엔티티로 분리하여 관리된다. 예를 들어 캐릭터 닉네임, 레벨, 경험치, 능력치 등의 데이터는 모두 Players에 저장된다.

이를 통해 시스템 내부적으로는 계정 정보와 캐릭터 정보를 명확히 구분하고, 사용자 입장에서는 마이페이지 등을 통해 자신의 정보를 확인하거나 닉네임, 이메일 등 일부 항목을 직접 수정할 수 있도록 구성된다.

5. 계정 삭제 기능

사용자의 자율성과 개인정보 보호를 위해 계정 삭제 기능도 제공된다. /api/accounts/{username} 엔드포인트를 통해 삭제를 요청할 수 있으며, 이 과정에서는 반드시 두 가지 보안 절차를 거친다. 먼저, JWT 토큰을 통한 본인 인증을 진행하고, 그 다음에는 비밀번호를 다시 입력받아 최종 확인을 수행한다.

계정 삭제가 확인되면, 사용자 정보뿐 아니라 해당 계정과 연결된 캐릭터 데이터(Players), 진행 중인 퀘스트(PlayerQuest), 인벤토리 정보(PlayerInventory) 등 관련된 모든 데이터를 함께 삭제한다. 이러한 설계는 단순히 데이터 제거뿐 아니라, 시스템의 데이터 정합성과 안정성을 유지하는 데 중점을 두었다. 향후에는 Cascade 삭제와 수동 삭제 방식을 병행하여 보다 정교한 데이터 처리 구조로 확장할 수 있다.