아침놀 Tech Blog : 6 월 2012 
 Django 에서 온라인 카드 결제 구현 하 기 
 APSys 2012 학회 웹 사이트 를 만들 면서 , 학회 등록비 를 받 기 위해 온라인 결제 를 구현 하 기 로 하 였 다 . 내 가 있 는 연구실 에서 예전 에 PAM 2009 학회 를 열 었 을 때 는 국내 등록 자 는 정보 과 학회 에서 제공 하 는 등록 페이지 를 이용 하 고 해외 등록 자 는 이메일 이나 FAX 로 등록 요청 을 받 아 카드 정보 를 기록 해 두 었 다가 현장 에서 카드 정보 를 대조 하 여 결제 를 진행 하 는 방식 을 사용 했 다 . 문제 는 아무래도 민감 한 카드 정보 를 온라인 으로 주고받 다 보 니 ( 요즘 이 야 대부분 의 이메일 서버 가 SSL / TLS 연결 을 기본 으로 쓰 기 는 하 지만 ) 좀 꺼림칙 하 다는 점 , 또 카드 정보 를 받 는 쪽 도 전달 자체 가 안전 한지 여부 와 상관 없이 민감 한 개인 정보 를 직접 들 고 있 다는 것 에 대한 부담감 이 있 게 마련 이 다 . 
 이번 에 는 그래서 결제 대행사 를 거치 기 로 하 였 다 . 정보 과 학회 하 고 얘기 해 보 니 올앳페이 라는 결제 대행사 와 계약 이 되 어 있 고 얘 네 들 이 해외 카드 결제 를 지원 한다고 하 여 직접 온라인 등록 페이지 를 만들 기 로 하 였 다 . 내 가 개발 에 조금 시간 을 써야 하 는 일 이 긴 하 지만 , 전체 적 으로 봤 을 때 등록비 정산 에 관한 업무 량 을 확 줄일 수 있 을 것 이 라 예상 했 기 때문 이 고 나 또한 실제 온라인 결제 가 어떤 방식 으로 구현 되 는지 기술 적 인 호기심 이 있 기 때문 이 기 도 했 다 . 
 올앳페이 에서 제공 한 매뉴얼 을 읽 어 보 니 인터넷 상 에서 의 온라인 쇼핑 은 크 게 다음 과 같 은 과정 으로 이루어진다는 것 을 알 수 있 었 다 . 
 사용자 가 물건 을 구매 하 겠 다는 의사 를 표시 함 . 즉 " 주문 " 이 라는 형태 로 쇼핑몰 서버 의 DB 또는 사용 자 session 에 주문 할 물품 에 대한 정보 가 생긴다 . 
 구매 하 는 과정 으로 들어가 면 , 쇼핑몰 은 배송 등 을 위한 주소 등 의 추가 정보 를 입력 받 는다 . 
 결제 방법 을 선택 하 면 각 결제 수단 에 따라 적절 한 인증 절차 를 거친다 . ( client side ) 
 예 ) ISP 안전 결제 등 
 결제 하 기 버튼 을 누르 면 쇼핑몰 서버 로 결제 내용 이 암호 화 되 어 전달 된다 . 쇼핑몰 서버 는 주문 정보 를 확인 하 여 금액 이 맞 게 들어왔 는지 한번 더 검증 하 고 , 이 를 결제 대행사 서버 로 보내 어 결과 를 리턴 받 는다 . ( server side ) 
 받 은 결과 를 보 고 결제 의 성공 / 실패 여부 를 확인 하 고 적절 한 후처리 를 한다 . 
 이 중 에서 결제 대행사 가 제공 하 는 부분 은 3 단계 의 client side 구현 체 와 4 단계 에서 결제 대행사 서버 로 데이터 를 주고받 는 API 이 다 . 이 두 단계 에서 는 다음 과 같이 보안 에 대한 고려 가 필요 하 다 . 
 결제 인증 과정 에서 신용카드 번호 와 비밀 번호 등 결제 하 는 데 필요 한 정보 가 쇼핑몰 서버 로 노출 되 지 않 아야 한다 . 이 는 결제 대행사 측 에서 제공 한 client side 플러그인 이 구현 해 준다 . 
 쇼핑몰 서버 에서 결제 대행사 서버 로 가 는 정보 는 암호 화 되 어야 한다 . 이 는 결제 대행사 에서 SSL 연결 을 제공 함 으로써 해결 가능 하 다 . 
 국내 에서 대부분 의 온라인 쇼핑 을 Microsoft 의 Internet Explorer 로 만 가능 하 게 만드 는 주범 은 바로 3 단계 의 client side 구현 체로 , 이것 이 대부분 ActiveX 플러그인 형태 로 만 제공 된다 . ( 경우 에 따라 키보드 보안 프로그램 등 이 설치 되 기 도 한다 . ㅠㅠ ) 쇼핑몰 서버 에 만 노출 시키 지 않 는 것 이 아니 라 , 사용자 PC 의 다른 프로그램 들 에 도 노출 시키 지 않 고자 하 는 , 즉 사용 자 PC 의 보안 을 쇼핑몰 / 결제 대행사 쪽 에서 지켜 주 어야 하 는 국내 인식 과 관련 제도 때문 이 다 . 또한 결제 대행사 자체 플러그 인 뿐 만 아니 라 카드 인증 등 에 사용 하 는 ISP 인증 플러그인 등 도 기본 적 으로 Windows binary 로 만 배포 되 는 것 같 은 데 이 니 시스 에 제공 하 는 오픈 웹 결제 는 이 부분 을 자체 구현 하 는 식 으로 해결 한 것 같 다 . 나머지 단계 는 쇼핑몰 제작자 의 의지 에 따라 얼마 든지 크로스 브라우징 환경 으로 구축 할 수 있 다 . 
 쇼핑몰 측 에서 는 결제 대행사 와 의 계약 내용 에 따라 , 신용 카드 만 지원 할 수 도 있 고 휴대폰 결제 나 무 통장 입금 등 의 좀 더 다양 한 결제 수단 을 지원 할 수 도 있 는데 , 어쨌든 이러 한 결제 수단 에 대한 인증 과정 은 모두 결제 대행사 의 플러그인 에서 처리 되 고 여기 에 쇼핑몰 이 개입 할 여지 는 없 다 . ( 어떤 수단 을 선택 할지 고르 는 화면 을 쇼핑몰 쪽 에서 제공 하 게 만들 수 는 있 다 . ) 개발자 입장 에서 는 client side 에서 javascript 파일 하나 연결 해 주 고 결제 화면 form submit 핸들러 를 결제 대행사 에서 제공 해 준 것 으로 대체 하 기 만 하 면 된다 . 
 내 경우 문제 는 . .. 올앳페이 에서 제공 하 는 API 라이브러리 중 에 Python 구현 이 없 었 다는 것 이 다 . PHP , JSP , ASP , ASP . NET , C ( ! ) 로 는 올앳페이 측 에서 결제 API 라이브러리 를 이미 제공 하 고 있 는데 , Python 용 코드 는 혹시나 했 는데 역시 나 없 더라 . ㅠㅠ 아직 Python / Django 플랫폼 으로 쇼핑몰 을 구축 하 는 사례 가 거의 없 다는 뜻 일 것 이 다 . 
 그래서 이걸 PHP 를 cli 로 실행 해서 인자 를 넘겨 처리 하 고 결과 값 을 받 아 오 는 식 으로 짜 야 하나 잠시 고민 했 는데 , 막상 API 라이브러리 소스 코드 를 열 어 보 니 괜히 함수 별 로 똑같 은 내용 을 복사 붙여 넣 기 해 놔서 길이 만 길 었 지 막상 하 는 일 은 약간 의 고유 오류 코드 처리 를 포함 한 SSL HTTP 요청 날리 는 게 전부 였 다 . 그래서 1 시간 만 에 뚝딱 포 팅 해 버리 고 그날 중 으로 실제로 결제 되 는 것 까지 확인 했 다 . 
 국내 를 대상 으로 하 는 보통 의 온라인 쇼핑몰 이 라면 여기 까지 만 하 면 땡 인데 , 내 경우 에 는 한 단계 가 더 있 었 다 . 국제 워크 샵 이 다 보 니 해외 참가자 들 의 등록비 도 결제 할 수 있 게 만들 어야 하 는 것 . 사실 그것 이 이 일 을 한 주 목적 이 기 도 했 고 . 
 결국 은 교수 님 이 해외 에 계실 때 발급 받 았 던 ' 진 퉁 ' 해외 카드 를 써서 야 최종 결제 테스트 에 성공 할 수 있 었 고 , 그 와중 에 있 었 던 자잘 한 프로그래밍 실수 나 버그 들 때문 에 며칠 동안 은 수동 으로 등록 절차 를 진행 해야 했 다 . 
 온라인 결제 연동 도 생각 보다 어려운 일 은 아니 라는 것 . 
 다른 사람 들 을 위해 github 에 올앳페이 결제 라이브러리 와 Django 예제 코드 들 을 공개 한다 . 
 작성자 : Joongi Kim 시간 : 오전 1 : 54 댓글 4 개 :