1. 프로젝트 개요
- 대규모 트래픽이 예상되는 글로벌 컨텐츠 평점 및 큐레이션 플랫폼
- 영화, 드라마, 스포츠 등 다양한 콘텐츠를 큐레이팅
- 나만의 콘텐츠 플레이리스트 만들기
- 실시간 에고편 같이 보기
- 팔로우 관계끼리 개인 DM 소통
2. 담당한 작업
- 사용자 관리 - 소셜 로그인, Security
- 어드민 기능
- 초기화: 서버 시작 시 어드민 계정을 자동으로 초기화합니다.
- 권한 관리: 사용자의 권한을
ADMIN
또는 **USER
**로 변경할 수 있습니다. 권한 변경 시 해당 사용자는 자동으로 로그아웃됩니다.
- 계정 잠금: 사용자 계정을 잠글 수 있으며, 잠긴 계정은 로그인할 수 없습니다. 잠긴 계정은 자동으로 로그아웃됩니다.
- 회원 가입: 이름, 이메일, 비밀번호를 입력하여 회원 가입할 수 있습니다.
- 로그인: 이메일과 비밀번호를 입력하여 로그인할 수 있습니다.
- JWT 기반 인증/인가를 사용합니다.
- 기존에 로그인된 계정이 있을 경우, 강제로 로그아웃 처리합니다.
- 비밀번호 초기화
- 이메일 주소로 임시 비밀번호를 발급합니다.
- 임시 비밀번호는 만료 시간을 가집니다.
- 임시 비밀번호로 로그인 시, 새 비밀번호로 변경해야 합니다.
- 소셜 계정 연동 (심화)
- Google, Kakao 계정을 연동할 수 있습니다.
3. 기술적 성과
- 권한 기반 접근 제어 (RBAC: Role-Based Access Control)
- Spring Security 기반으로
ADMIN
과 USER
역할 구분 및 접근 제어 구현
- 관리자에 한해 사용자 권한 변경 및 계정 잠금 기능 허용
- 권한 변경/잠금 시 JWT 세션 무효화 → 즉시 로그아웃 처리 (
SecurityContextHolder
클리어 및 블랙리스트 등록)
- JWT 기반 인증/인가 시스템 구축
AccessToken
과 RefreshToken
전략 구현
- 로그인 시 토큰 발급, Authorization Header를 통해 인증 수행
- 기존 로그인 세션이 존재하는 경우 선제적 무효화 처리
- 로그아웃 시 메모리기반 블랙리스트 처리로 보안 강화
- 임시 비밀번호 및 인증 절차 구현
- 비밀번호 초기화 시 이메일로 임시 비밀번호 전송
- 임시 비밀번호에는 만료 시간 (TTL) 적용 → 만료 시 사용 불가
- 소셜 로그인 연동 (Google, Kakao)
- OAuth2 기반 로그인 흐름 구현 (Spring Security OAuth2 Client 활용)
- 소셜 로그인 성공 시 신규 회원 자동 가입 또는 기존 회원 연동
- 사용자 정보는
OAuth2User
추상화를 통해 통합 처리
- 소셜 계정 연동 여부 판단 → 추가 정보 입력 요구 시 리다이렉트 처리
- 초기 어드민 계정 자동 생성
- 계정 상태 관리 기능
- DB에
isLocked
필드 추가 및 로그인 시 체크
- 잠금된 계정은 인증 필터에서 차단
- 관리자에 의한 잠금 시 기존 세션 즉시 무효화 처리
- 보안성 강화를 위한 로깅 및 예외 처리
- 로그인 시도, 비정상 접근, 권한 변경, 계정 잠금 등의 감사 로그 작성
@ControllerAdvice
를 통한 전역 예외 처리로 보안 메시지 일관성 유지
4. 문제점 및 해결 과정
S (Situation) - 상황
JWT 기반 인증/인가 시스템과 Google, Kakao 소셜 로그인을 포함한 사용자 관리 기능을 구현하던 중, 사용자 권한 변경, 계정 잠금, 임시 비밀번호 발급 등 다양한 예외 상황에서 토큰 기반 인증 처리와 세션 무효화 로직의 충돌 문제가 발생했습니다.
또한 소셜 로그인 사용자의 정보가 일관되지 않아 회원 연동 문제도 발생했습니다.