카테고리 없음

아웃소싱 프로젝트 내가 맡았던 부분 기능 간략 설명(User CURD, JWT토큰,시큐리티 필터)

404NotFoundMe 2025. 4. 28. 21:48

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와 세션을 같이 사용한다고 함
  • 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 접근 차단.