-
스프링시큐리티 적용 로그인 구현 및 비회원 주문 로직 추가이커머스 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'이커머스 devops > 국비교육' 카테고리의 다른 글
Redis - 카테고리 조회 적용 (1) 2025.12.06 P6Spy 적용하기 (0) 2025.11.22 Resolved [org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: (0) 2025.11.22 실무 활용 - 스프링 데이터 JPA와 Querydsl (0) 2025.11.19 동적 쿼리와 성능 최적화 조회 (0) 2025.11.19