현재 로직은 카드 id값을 requestParam값으로 넘겨주어 post요청을 보내며 url 단축도 같은 방식으로 진행하는 식으로 되어있다. 그래서 url이 http://3.36.97.132:9090/~/completedCard/104 과 같은 형식으로 되어있는데, 이 url에는 다른 사용자가 맨 끝 숫자를 사용하여 타인의 url에 접근할 수 있는 문제점이 있었다.
가장 간단한 URL Manipulation 방지법은 user를 검증하는 것인데, 우리의 서비스는 사용자가 카드를 만든 후 결제하면 생성되는 url로 로그인하지 않은 불특정 다수가 접근할 수 있는 서비스이기 때문에 user를 검증할 수 없었다.
또한, 카드를 공개/비공개로 바꾸어 비공개의 경우에는 카드를 만든 사람 말고는 조회하지 않게 할 수도 있었다. 하지만, 그러면 원하는 사용자(지인)에게도 공유하지 못한다는 UX적 문제가 발생하게 되었다.
따라서, url의 requestParam값을 암호화하여 컨트롤러에 보여주고, 이를 사용할 때에는 서버 측에서 복호화 하는 식으로 로직을 수정하려고 하였다.
기존에 작성되어 있는 코드는 cardID 값을 매개변수로 받아 모든 로직을 실행한다. 그러므로 기존 작성 코드를 최소한으로 수정하는 방법은 단 하나뿐이었다. 기존 url로 get 요청이 들어오면 암호화시킨 후 암호화 url로 서버 측에서 바로 리다이렉트 시켜주는 방법이다. 그러면 리다이렉트된 url로도 get요청이 갈텐데, 이 때 기존 로직을 수행하면 되는 것이다.
한마디로, 다음과 같다.
~completedCard/104로 get 요청 발생 -> URL 암호화 후 redirect -> redirect URL로 get 요청 발생 -> URL 복호화 후 cardID 값을 추출하여 카드 정보를 가져옴
@GetMapping("/completedCard/{cardID}")
public String getCompletedCardPage(@PathVariable int cardID) {
String originUrl = "completedCard/" + cardID;
String encodeUrl = Base64Util.encode(originUrl);
return "redirect:/card/" + encodeUrl;
}
@GetMapping("/{encodedUrl}")
public String decodeCompletedCardPage(@PathVariable String encodedUrl, Model model) {
try {
// URL 디코딩
String decodedUrl = Base64Util.decode(encodedUrl);
String[] parts = decodedUrl.split("/");
int cardID = Integer.parseInt(parts[parts.length - 1]);
System.out.println("카드 ID : " + cardID);
// 카드 정보 가져오기
CardVO cardVO = editService.getCompletedCardPage(cardID);
model.addAttribute("cardVO", cardVO);
// 카드의 CSS 정보 추출
String css = cardVO.getTemplateThumbnail().substring(25, cardVO.getTemplateThumbnail().length() - 4);
model.addAttribute("css", css);
// 방명록 정보 가져오기
List<GuestBookVO> guestBooks = editService.selectGuestBooks(cardVO.getCardID());
model.addAttribute("guestBooks", guestBooks);
return "card/completedCard";
} catch (IllegalArgumentException e) {
model.addAttribute("error", "Invalid URL encoding.");
return "error";
} catch (Exception e) {
model.addAttribute("error", "An error occurred while processing your request.");
return "error";
}
}
그럼 기존 url이 변경되어 ~/card/Y29tcGxldGVkQ2FyZC8xMA== 와 같은 형식으로 암호화되어 브라우저에 표시되는 것을 볼 수 있다. 또한, 위의 암호화된 url로 접속되면 잘 접속되는 것을 알 수 있다.
