본문 바로가기
Study in Bootcamp/Main Project

[Main Project] Day 12 : 카카오 API를 이용하여 결제 구현 및 토큰 재발급

by Bhinney 2022. 11. 24.

본 글은 프로젝트를 기록하기 위해 적은 글 입니다.

수정이 될 수 있으며, 정확하지 않을 수 있습니다.


👩🏻‍🌾 어제의 에러 해결

💡어제 안되었던 부분의 원인(참조 : https://bhinney.tistory.com/142)

: 어제 계속해서 Body가 생성되지 않는 다는 에러를 만났다. 해당 부분의 에러를 확인하던 도중 이유를 알게 되었다. 아래의 사진을 보면 Authorization에서 어드민 키 앞에 "KakaoAK "가 붙는 것을 알 수 있다. 이게 내가 문제가 발생했던 이유였다. 나는 헤더에 그냥 어드민 키를 입력하였기 때문에 바디가 생성되지 않았던 것이다. 어드민 키 앞에 "KakaoAK "를 붙여주니 바디가 아주 잘 생성되었다..🥲

 


👩🏻‍🌾 카카오 API를 이용하여 결제 구현

: 카카오 API를 이용하여 결제를 구현했다. 주문이 등록되고 요청이 들어가면, Kakao 결제가 가능한 QR의 리다이렉트 페이지를 받을 수 있다. 해당 QR을 찍으면 테스터 결제가 가능하다. 아래처럼 포스트맨에 결제 준비 요청을 넣으면 결제가 가능한 url을 받을 수 있다. 해당 url로 들어가 QR을 만날 수 있고, 해당 QR을 찍으면 테스터 결제할 수 있는 페이지가 나온다. 그리고 결제를 하면 카카오톡으로 결제가 된 내역까지 받을 수 있다. (여기서 주의할 점은, QR을 찍고 결제 창이 나왔을 때 두번째 오른쪽 사진처럼 페이지가 뜬 후 결제해야한다는 것이다. 그렇지 않으면 결제가 제대로 이루어지지 않았다.)


👩🏻‍🌾 Access Token 재발급

: AOP를 이용해서 AccessToken 재발급을 구현해보았다. 어노테이션을 만들고 @Before에 해당 어노테이션을 설정해서 void로 메서드를 만들어서 구현해주었고, 재발급이 되는 것을 확인하였다. 일부러 엑세스 토큰 시간을 짧게하여서 확인해보았다. 아래처럼 코드를 짜보았고 (우선 생각한 데로 코드를 구현만 해보았다. 이후 이 코드를 쓰게 된다면 리팩터링 될 것이다.) 포스트맨으로 확인했을 때 헤더로도 잘 들어가고 로그로도 확인이 되는 것을 알 수 있었다.

 

🤔 하지만 이렇게 매번 하는 것은 비효율적이라고 생각한다. 아마 내가 이해하지 못한 필터나 구현을 제대로 하지 못한 Security 안에서 해당 부분을 필터링해주는 부분이 있지 않을까 하는 생각이 든다. 그래서 다시 구현해보면서 해당 부분의 코드를 찾아보고 싶은게 내일 나의 목표이다.

 

@Before("@annotation(reissueToken)")
public void getAccessTokenAgain(ReissueToken reissueToken) throws Throwable {
   log.info("# 엑세스 토큰 유효성 검사");
   ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
   HttpServletRequest request = requestAttributes.getRequest();
   HttpServletResponse response = requestAttributes.getResponse();

   String accessToken = request.getHeader("Authorization").replace("Bearer ", "");

   if (accessToken == null) {
      throw new RuntimeException("엑세스 토큰이 존재하지 않습니다.");
   }

   /* 토큰 유효 시간 */
   Date now = new Date();
   long validTime = securityProvider.getTokenClaims(accessToken).getExpiration().getTime() - now.getTime();

   Authentication authentication = securityProvider.getAuthentication(accessToken);
   log.info("# 재발급 전 엑세스 토큰 : {}", accessToken);

   long target = 1000 * 60 * 10;
   log.info("valid time : {}", validTime);
   log.info("target time : {}", target);

   /* 엑세스 토큰의 시간이 10분 이내로 남았다면 재 발급 */
   if (validTime <= target) {
      String role = authentication.getAuthorities().toString().replace("[ROLE_","").replace("]", "");
      accessToken =
         securityProvider.createAccessToken(authentication.getName(), role, null);
      log.info("authorities : {}", role);
      log.info("# 재발급 엑세스 토큰 : {}", accessToken);
   }

   response.setHeader("Authorization", accessToken);

   log.info("# 토큰 유효성 검사 종료 ");
}​


🔥내일 할 일

  • security로 토큰 재발급이 가능한지 찾기
  • 리프레시 토큰도 재발급 해보기
  • Spring Security로 다시 로그인 새롭게 구현하면서 코드에 부족한 부분 수정해보기

댓글