← Back to Projects
03 · Backend Portfolio
pay-system
PortOne · KG이니시스 연동 기반의 다중 상품 주문 · 포인트 · 환불 결제 시스템.
| 기간 | 2주 · 2026.03.16 — 03.27 |
|---|---|
| 팀 | 백엔드 5명 (팀장) |
| 역할 |
|
| 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
기술 선택 근거 (담당 영역)
| JWT | vs Session — 서버에 세션 상태를 두지 않는 stateless 구조. 다중 인스턴스 확장 시 세션 공유(스티키 세션·세션 스토어) 부담 없이 인증 처리. |
|---|---|
| 포인트 가점유 | vs 즉시 차감 / 결제 후 차감 — 즉시 차감은 결제 실패 시 복원 로직 필요, 결제 후 차감은 잔액 이중 사용 위험. 결제 시작 시 사용분을 가점유로 잡고, 성공 시 확정 차감 / 실패·만료 시 점유 해제. |
04 · 기술적 도전
JWT 로그아웃
JWT 로그아웃
즉시 무효화.
문제
Stateless JWT 구조상 로그아웃 후에도 Access Token이 만료 전까지 유효 → 탈취 시 재사용 위험.
원인
JWT는 서버가 상태를 갖지 않아, 발급된 토큰을 만료 전에 서버에서 무효화할 수단이 없음.
해결
- 로그아웃 시 Access Token을 blacklist DB에 등록해 만료 전 재사용을 즉시 차단
- Refresh Token 삭제로 재발급 경로 차단 (재로그인 없이는 재발급 불가)
- Refresh Token에 사용자 정보가 포함된 경우 Access Token 동반 검증 없이 Refresh Token 단독 검증으로 재발급 흐름 단순화
결과
로그아웃 후 Access Token 최대 30분 재사용 가능 구간을 즉시 차단으로 전환. 블랙리스트 누적 문제는 Redis TTL 전환 과제로 식별.
TROUBLESHOOTING
JWT 로그아웃 즉시 무효화
05 · 회고
회고.
팀장을 맡으면서 문서화와 일정 관리의 중요성을 체감했습니다.
구현 능력만큼이나 팀의 진행 상황을 정리하고 공유하는 게 프로젝트 완주의 조건이라는 걸 배웠습니다.