← Back to Projects

03 · Backend Portfolio

pay-system

PortOne · KG이니시스 연동 기반의 다중 상품 주문 · 포인트 · 환불 결제 시스템.

오조의 마법상점 로고
기간2주 · 2026.03.16 — 03.27
백엔드 5명 (팀장)
역할
  • 팀장 · 발표
  • JWT 기반 인증 · 인가 구조 (Access + Refresh + 로그아웃 blacklist)
  • 포인트 가점유 로직
  • 결제 스케줄러
Links GitHub ↗
02 · 프로젝트 개요

커머스 결제 시스템.

다중 상품 주문 · PortOne 결제 · 포인트 · 환불까지 이커머스 결제 흐름을 한 사이클로 구현한 팀 프로젝트. 결제 성공 시 주문 생성 / 재고 차감 / 포인트 사용·적립을 하나의 트랜잭션으로 묶고, 실패 시 롤백되는 구조가 요구사항의 핵심.

주문 · 결제 · 포인트 · 환불

PortOne + KG이니시스 연동, 다중 상품 결제. 주문 확정 시 포인트 적립 / 결제 실패·환불 시 사용 포인트 복구.

웹훅 기반 검증

Header Signature 검증 + PortOne API 재검증의 이중 검증 구조로 위변조·중복 방지.

JWT 인증 · 인가

Access + Refresh 구조, 로그아웃 시 Access 토큰 blacklist 등록으로 즉시 무효화.

03 · 기술 스택

사용한 기술.

LanguageJava 17
FrameworkSpring Boot 4.0.1
ORMSpring Data JPA (Hibernate)
SecuritySpring Security · JWT (jjwt 0.12)
ViewThymeleaf
DatabaseMySQL · H2
PaymentPortOne server-sdk 0.23
BuildDocker · Gradle

기술 선택 근거 (담당 영역)

JWTvs Session — 서버에 세션 상태를 두지 않는 stateless 구조. 다중 인스턴스 확장 시 세션 공유(스티키 세션·세션 스토어) 부담 없이 인증 처리.
포인트 가점유vs 즉시 차감 / 결제 후 차감 — 즉시 차감은 결제 실패 시 복원 로직 필요, 결제 후 차감은 잔액 이중 사용 위험. 결제 시작 시 사용분을 가점유로 잡고, 성공 시 확정 차감 / 실패·만료 시 점유 해제.
04 · 기술적 도전

JWT 로그아웃
즉시 무효화.

문제
Stateless JWT 구조상 로그아웃 후에도 Access Token이 만료 전까지 유효 → 탈취 시 재사용 위험.
원인
JWT는 서버가 상태를 갖지 않아, 발급된 토큰을 만료 전에 서버에서 무효화할 수단이 없음.
해결
  1. 로그아웃 시 Access Token을 blacklist DB에 등록해 만료 전 재사용을 즉시 차단
  2. Refresh Token 삭제로 재발급 경로 차단 (재로그인 없이는 재발급 불가)
  3. Refresh Token에 사용자 정보가 포함된 경우 Access Token 동반 검증 없이 Refresh Token 단독 검증으로 재발급 흐름 단순화
결과
로그아웃 후 Access Token 최대 30분 재사용 가능 구간을 즉시 차단으로 전환. 블랙리스트 누적 문제는 Redis TTL 전환 과제로 식별.
05 · 회고

회고.

팀장을 맡으면서 문서화와 일정 관리의 중요성을 체감했습니다.

구현 능력만큼이나 팀의 진행 상황을 정리하고 공유하는 게 프로젝트 완주의 조건이라는 걸 배웠습니다.