ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링시큐리티 적용 로그인 구현 및 비회원 주문 로직 추가
    이커머스 devops/국비교육 2025. 12. 14. 16:36

    스프링시큐리티 흐름

    [클라이언트]
     │
     │ POST /api/login
     │ Body: { "username": "user", "password": "1234" }
     │

    ┌──────────────────────────────┐
      │ SecurityFilterChain (전체 보안 설정의 시작점)                                           │
    └──────────────────────────────┘
     │    /api/** 경로 매칭
     │

    ┌──────────────────────────────┐
      │    RestAuthenticationFilter (요청 가로채기)                                               │
      │    - HTTP 요청을 가로채서 JSON 파싱, 인증 토큰 생성                                 │
      │       1. JSON 파싱 → LoginRequest                                                            │
      │       2. RestAuthenticationToken 생성 (미인증 상태)                                  │
      │       5. AuthenticationManager.authenticate() 호출                                │
    └──────────────────────────────┘
     │
     │ [AuthenticationManager] : 적합한 Provider 선택
     │

    ┌──────────────────────────────┐
      │    RestAuthenticationProvider ─── 실제 인증 로직                               │
      │    - DB 조회, 비밀번호 검증                                                                           │
      │       1. CustomUserDetailsService.loadUserByUsername() 호출           │
      │       2. 비밀번호 검증                                                                                     │
      │       - 실패 시 BadCredentialsException.                                                   │
      │      - 성공 시 인증된 RestAuthenticationToken 반환                                   │
    └──────────────────────────────┘
     │
     │ [CustomUserDetailsService] 
     │ 1. DB에서 User 조회
     │ 2. AccountMapper로 User Entity → Account(UserDetails 구현체 (인증된 사용자 정보)) 변환
     │

    [인증 결과 분기]
     │
    ├─ 성공 → RestAuthenticationSuccessHandler (인증 성공 시 JSON 응답 반환 + 장바구니 병합)
     │                      │
     │                      │ 1. Account → LoginResponse 변환
     │                      │ 2. JSON 응답 반환
     │                      │ 3. 세션에 SecurityContext 저장 (Redis)
     │                      │ 4. 비회원 장바구니 병합
     │                      │
     │                     ▼
     │                     [클라이언트에게 응답 + SESSION 쿠키]
     │
    └─ 실패 → RestAuthenticationFailureHandler (인증 실패 시 에러 JSON 응답 반환)
                           │
                           │ 에러 JSON 응답 반환
                           │
                          ▼
                         [클라이언트에게 에러 응답]

    * RestAuthenticationEntryPoint : 미인증 상태에서 보호된 API 접근 시
    * RestAccessDeniedHandler : 인증은 됐지만 권한이 없을 때

     

     

    Redis 세션 저장 구조

    spring:session:sessions:{sessionId}
        │
       ├── creationTime
       ├── lastAccessedTime
       ├── maxInactiveInterval
      └── sessionAttr : SPRING_SECURITY_CONTEXT
                      │
                    └── RestAuthenticationToken
                                    │
                                  └── principal: Account
                                                   │
                                                  ├── accountId
                                                  ├── email
                                                  ├── name
                                                 └── authorities

     

     

    비회원 주문 로직

    비회원 로그인 존재 하지 않음

    장바구니 > 로그인 페이지 > 비회원 로그인 버튼 > 결제창

    비회원 주문 페이지 예시

    기존에 생각했던 방법

    - role_tbl에 guest 필드 추가

    - 게스트도 기존 users_tbl 사용

    - users_tbl, orders_tbl 수정 필요 없음

     

    문제는 ?

    - 비회원 주문할 때마다 users 테이블에 row 생성?

    - 같은 비회원이 10개 주문하면 10개의 행이 생성되어 users_tbl 관리 어려워짐

    - 비회원은 "사용자"가 아님

        - 회원     : 가입 → 로그인 → 주문 → 재주문

        - 비회원 : 그냥 주문 (일회성)

     

     

    방법 1. 기존 orders_tbl에 필드 추가 - 컬럼 일부 null 허용

    방법 2. guest용 별도 테이블 분리      - 통계시 join 필요

     

     

    [ 방법1 - orders_tbl 수정 후 구현 ]

    • 주문창에서 활용될 delivery_addresses 테이블 추가
    • 비회원 주문용 orders 테이블에 guest_password 필드 추가
    728x90
Designed by Tistory.