개발 환경

스프링 부트  2.4.0 + ubuntu 20.04+ nginx1.18.0



진행 중인 프로젝트에서 기존 로그인 로직 수정 요청이 들어오며 추가로 다날 SMS 본인인증 처리가 필요해졌다.

서브 도메인을 연결하여 SMS 인증 페이지를 띄워 웹뷰를 통해 클라이언트 분들이 사용할 수 있도록 해야했고 보안을 위해 access 토큰을 서버사이드에서 받아 클라이언트로 보낼 수 있도록 관련 API를 개발했다.

다날 아임포트사에서 코드 예시와 함께 가이드 라인을 제공해주고 있는데 다 node.js다..깃헙 레포를 통해 java 사용자들도 사용할 수 있도록 maven 플러그인을 제공해주고 있으니 참고하면 좋을 것 같다. 필자는 gradle을 사용하고 있기도하고 제공해주는 모듈에서 안쓰는 기능들이 많아 간단하게 코드로 직접 만들어서 개발했다.
https://github.com/iamport/iamport-rest-client-java

 

GitHub - iamport/iamport-rest-client-java: JAVA사용자를 위한 아임포트 REST API 연동 모듈입니다

JAVA사용자를 위한 아임포트 REST API 연동 모듈입니다. Contribute to iamport/iamport-rest-client-java development by creating an account on GitHub.

github.com

 

<서브 도메인으로 본인인증 페이지 띄우기>

다날 SMS 본인 인증 페이지를 띄울 수 있는 html 파일의 코드는 아래와 같다.

<!DOCTYPE html>
<html>
<head>
<!-- jQuery -->
<script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.min.js" ></script>
<!-- iamport.payment.js -->
<script type="text/javascript" src="https://cdn.iamport.kr/js/iamport.payment-1.1.4.js"></script>
</head>

<body>
<script type="text/javascript">
IMP.init('가맹점식별코드를입력해주세요.');
IMP.certification({
merchant_uid : 'merchant_' + new Date().getTime() //본인인증과 연관된 가맹점 내부 주문번호가 있다면 넘겨주세요
}, function(rsp) {
if ( rsp.success ) {
    // 인증성공
    console.log(rsp.imp_uid);
    console.log(rsp.merchant_uid);

$.ajax({
    type : 'POST',
    url : '/certifications/confirm',
    dataType : 'json',
    data : {
    imp_uid : rsp.imp_uid
    }
    }).done(function(rsp) {
    // 이후 Business Logic 처리하시면 됩니다.
    });

} else {
    // 인증취소 또는 인증실패
    var msg = '인증에 실패하였습니다.';
    msg += '에러내용 : ' + rsp.error_msg;

    alert(msg);
    }
});

</script>
</body>
</html>

가맹점 식별 코드를 적어 해당 html 파일을 만들었다면 운영 중인 서버의 원하는 위치에 파일을 위치시킨다.


다음으로 사용 중인 도메인에 서브 도메인을 하나 새로 파자!

필자가 참여 중인 프로젝트는 가비아라는 도메인 판매 사이트를 이용하고 있어 해당 사이트에서 서브 도메인을 추가해줬다.

각자의 상황에 맞는 도메인 판매 사이트에서 서브 도메인 관련 설정을 맞췄다면 ec2 nginx의 설정을 변경해 서브 도메인을 연결해줘야한다.

위 내용은 이전 포스팅에서 다룬 적 있어 해당 포스팅 링크로 대체!

https://cofls6581.tistory.com/64

 

[서브 도메인] 서브도메인 적용 및 프로젝트 폴더 분리 (가비아)

개발용 서버와 배포용 서버를 분리하기 위해 서브 도메인을 적용해보자. 개발용 주소는 dev.도메인 주소로 설정하고 배포용 주소는 prod.도메인 주소를 사용하겠다. 이름은 취사 선택의 문제로 원

cofls6581.tistory.com

root에는 위에서 만든 html 파일이 존재하는 파일 경로를 써주고 index에는 html 파일의 이름을 적어주면 된다.

이후 연결한 서브 도메인으로 접속하면 본인 인증 페이지가 잘 뜸을 확인할 수 있다.

만약, 이때 제대로 뜨지 않는다면 포트 번호와 서버의 인바운드 규칙 등을 확인해보자.


<아임포트 access 토큰 전달 API 구축>

컨트롤러단

    
    private final UserService userService;
    
    @ApiOperation(value = "아임포트 access token 발급 API") //스웨거 사용안할 시 생략 가능
    @GetMapping("/iamports/accessToken")
    public BaseResponse<String> getIamportAccessToken() {
        return new BaseResponse<>(userService.getIamportAccessToken());
    }

 

서비스단

    @Transactional
    public String getIamportAccessToken () {
        RestTemplate restTemplate = new RestTemplate();
        String requestUrl = "https://api.iamport.kr/users/getToken";

        Map<String, String> iamportKey = new HashMap();
        iamportKey.put("imp_key", imp_key); //발급받은 REST API key 값을 넣어주세요
        iamportKey.put("imp_secret",imp_secret); //발급받은 REST API secret 값을 넣어주세요.

        ResponseEntity<Object> responseData = restTemplate.postForEntity(requestUrl, iamportKey, Object.class);
        LinkedHashMap responseBody = (LinkedHashMap) responseData.getBody();
        LinkedHashMap responseBodyProps = (LinkedHashMap) responseBody.get("response");
        String accessToken = (String) responseBodyProps.get("access_token");

        return accessToken;
    }

필자는 키 값들을 노출시키지 않기 위해 다른 파일에 적은 후 git ignore에 해당 파일을 추가하여 개발했다.

 

참고 사이트

https://docs.iamport.kr/tech/mobile-authentication

https://blog.naver.com/iamport/221004352427

https://cordingmonster.tistory.com/76

+ Recent posts