1. 프로젝트 개요 (중요도 및 어려움 표시 ★)
- 회원 가입, 로그인, 회원 정보 조회/수정/삭제 기능을 제공.
- JWT 토큰을 활용해 인증 및 인가를 처리하고, Spring Security 필터를 커스텀하여 보안을 강화.
- 상태 기반 세션이 아닌 Stateless(무상태) 방식으로 구현.
- 메서드 단에서는 @PreAuthorize를 사용하여 사용자의 권한(Role)을 세밀하게 제어.
2. JWT 인증/인가 흐름
2-1. 로그인/회원가입
- /auth/signup : 회원가입 API (비밀번호 암호화 후 저장)
- /auth/login : 로그인 시 이메일+비밀번호 검증 후 Access Token 발급.
2-2. 발급된 JWT 토큰 구조
- Payload : userId, userName, email, role 저장
- Header : Authorization: Bearer <AccessToken>
3. 시큐리티 필터 기능 ★★★★★
3-1. JwtAuthenticationFilter (인증 필터)
- 모든 요청에 대해 Authorization 헤더에서 토큰을 추출.
- 토큰 검증 → 유저 정보 조회 → SecurityContextHolder에 인증 객체 저장.
- 인증 실패 시 다음 필터로 넘김.
String token = request.getHeader("Authorization");
if (token == null || !jwtUtil.validateToken(token)) {
filterChain.doFilter(request, response); return;
}
3-2. JwtAuthenticationEntryPoint (인증 실패 핸들러)
- 로그인하지 않은 사용자가 인증이 필요한 요청을 할 경우 401 에러 발생.
- 커스텀 메시지로 "로그인이 필요합니다." 반환.
3-3. JwtAccessDeniedHandler (권한 거부 핸들러)
- 인증은 되었지만 권한이 부족한 경우 403 에러 발생.
- 커스텀 메시지로 "권한이 없습니다. 관리자에게 문의하세요." 반환.
3-4. @AuthenticationPrincipal ★★★★★
- Spring Security가 인증한 사용자 정보를 컨트롤러 메서드 매개변수에 바로 주입해주는 어노테이션입니다.
- SecurityContextHolder에 저장된 인증 객체(Authentication)의 Principal을 자동으로 꺼내서 넣어줍니다.
- 쉽게 말하면 "로그인한 사용자의 정보를 별도 조회 없이 바로 받아서 사용할 수 있도록 해주는 어노테이션"
3-4. @PreAuthorize("hasRole('사장님')") ★★★★★
- 메서드 실행 전에 특정 권한(Role) 이 있는지 검사하는 어노테이션입니다.
- 보통 컨트롤러 또는 서비스 메서드 위에 붙입니다.
- 권한이 없으면 아예 메서드 실행을 막고 403 Forbidden 에러를 발생시킵니다.
- AOP(관점 지향 프로그래밍) 방식으로 동작합니다.
- 쉽게 말하면 "이 메서드는 '사장님' 권한을 가진 사람만 사용할 수 있다."는 뜻
4. CustomUserDetails (유저 인증 객체)
- UserDetails를 구현해서 User 엔티티를 그대로 들고 있음.
- 인증된 사용자의 ID, Email, Role, Password 등을 관리.
5. SecurityConfig 설정 ★★★★★
- csrf 비활성화(이 부분에 대해서 조금 많이 알게되었음)
- CSRF(Cross-Site Request Forgery)란?
"로그인된 사용자의 세션/쿠키 정보를 이용해서,
그 사용자가 원하지 않는 요청을 다른 웹사이트가 대신 보내는 공격" - 보통 csrf와 세션을 같이 사용한다고 함
- CSRF(Cross-Site Request Forgery)란?
- session 비활성화 (STATELESS)
- /auth/** 경로는 인증 없이 접근 가능
- 그 외 모든 경로는 JWT 인증 필요
- jwtAuthenticationFilter를 UsernamePasswordAuthenticationFilter 앞에 등록
6. 유저 CRUD 기능
6-1. 유저 조회
- GET /user/{userId} : 특정 유저 조회
- GET /user/checkLogin : 로그인한 본인 정보 조회
6-2. 유저 수정 ★★★
- 쿠키(delete_auth) 인증 후 수정 가능 (비밀번호로 인증된 3분 쿠키)
- 이름, 이메일, 전화번호, 주소, 비밀번호 변경 가능.
6-3. 유저 삭제 (소프트 삭제)
- 실제 데이터베이스 삭제가 아닌, deletedAt 필드에 삭제 시간 기록 및 상태변경.
7. 보안 강화 요소
- 비밀번호는 BCrypt로 암호화 저장.
- 삭제/수정 요청 전 비밀번호 재확인 쿠키 인증.
- JWT 토큰 검증 및 예외 처리 세분화.
- 유저 탈퇴/잠금/삭제 상태 체크 후 API 접근 차단.