Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 인텔리제이 한글 깨짐 해결법
- JAVA기초
- While
- Java
- break문
- Thread
- 시스템 환경 변수 편집
- 집합관계
- 생성자
- java변수
- 메서드 오버로딩
- for문
- 형 변환
- 인텔리제이 기초 설정
- OPP개념
- 컴파일
- 연관관계
- 포함관계
- JAVA객체지향
- 반복문
- 접근제어지시자
- 메서드
- 상수
- continue문
- this예약어
- IntelliJ IDEA
- multi-threading
- 자바 멀티스레딩
- function
- Java데이터 타입
Archives
- Today
- Total
최원종의 개발 블로그
V17 PG사 연결 - 포트원 연동하기 본문

https://developers.portone.io/opi/ko/integration/start/v2/checkout?v=v2
인증 결제 연동하기
PG 결제창을 이용하는 인증 결제를 연동합니다.
developers.portone.io
핵심 개념 정리
1. PG(Payment Gateway)와 결제 대행이란
PG사(결제 대행사)는 우리 서비스와 카드사·은행·간편결제 사이에서 결제를 중계해 주는 사업자입니다.
카드사마다 연동 규격이 달라 직접 붙으면 너무 복잡하기 때문에,
표준화된 창구 하나로 묶어주는 중계자를 둡니다.
포트원
포트원(구 아임포트)은 그 PG사들조차 하나의 규격으로 다시 묶어주는 상위 중계 서비스입니다.
우리 코드는 포트원 한 곳만 연동하면, 카카오페이·카드 등 결제 수단은 설정만 바꿔 교체할 수 있습니다.
예를 들어본다면 은행마다 다른 창구를 찾아갈 필요 없이,
공용망 한 곳에 붙으면 어느 은행이든 거래할 수 있습니다.
2. 결제는 보통 세 단계로 나뉨
1단계 - 사전 준비 (서버가 주문 식별자(주문번호)를 발급)
2단계 - 결제창 ( 사용자가 카카오페이/카드로 실제 결제 )
3단계 - 검증 ( 서버가 결제가 진짜인지 확인한 뒤 처리(포인트 지급 등) )
한 번의 요청으로 끝나지 않는 이유는, 실제 결제는 외부(PG)에서 일어나고
우리 서버는 그 결과를 확인하고 해서 포인트 및 실제 구매 처리를 해야 합니다.
3. 신뢰 경계: 브라우저(프론트)는 믿으면 안 된다
브라우저에서 서버로 오는 값은 사용자가 개발자 도구 등으로 얼마든지 조작할 수 있습니다.
그래서 "결제 성공했고 5만원 냈어요"라는 프론트의 말을 그대로 믿으면 안 됩니다.
최종 판단은 서버가 PG에 직접 물어봐서 내려야 합니다.
4. 결제 보안 3대 핵심
PG 결제 검증 단계에서 반드시 지켜야 하는 세 가지입니다.
첫째, 서버 검증. 실제로 결제가 됐는지 서버가 PG에 직접 조회해 결제 상태(예: 완료)를 확인합니다.
둘째, 위변조 방지. 충전·적립 금액은 프론트가 보낸 값이 아니라,
PG가 알려준 실제 결제 금액을 사용합니다.
셋째, 중복 결제 방지. 같은 결제 건이 두 번 처리되지 않도록 고유 식별자에 유니크 제약을 걸고,
이미 처리됐는지 먼저 확인합니다.
키 설정 (PORTONE_API_SECRET 노출 금지)
#포트원 REST 키
PORTONE_STORE_ID=store-061967fa-37f4-4f44-81a0-8684fab8c6da
PORTONE_CHANNEL_KEY=channel-key-90b25dfd-8375-4bee-a4f8-4c9f04e89661
PORTONE_API_SECRET=AzM5Eo64oG4Nonjd7ffYzQvlkehYPaGj9CjhOkMxvrbPYnlX2YKgtVe1I2DhfazXOm6sbDsw6RtnLrqq
application.yml 변수 추가
portone:
store-id: ${PORTONE_STORE_ID}
channel-key: ${PORTONE_CHANNEL_KEY}
api-secret: ${PORTONE_API_SECRET}
'Spring boot 입문 > Spring boot 입문 -1' 카테고리의 다른 글
| V16-4 유료 게시글 구매하기 (0) | 2026.06.25 |
|---|---|
| V16-3 Board 상세보기 유료/무료 구분 (0) | 2026.06.25 |
| V16-2 포인트 시스템의 개념과 유료 게시글 (0) | 2026.06.25 |
| V16-1 포인트 시스템(유료 게시글 기능 추가) (0) | 2026.06.23 |
| V15-4 이메일 인증 후 회원가입 로직 변경 (0) | 2026.06.23 |
