diff --git a/src/main/java/nlib/cmm/NlibCommonController.java b/src/main/java/nlib/cmm/NlibCommonController.java index e2ababa5..7c26a9c9 100644 --- a/src/main/java/nlib/cmm/NlibCommonController.java +++ b/src/main/java/nlib/cmm/NlibCommonController.java @@ -29,6 +29,7 @@ import nlib.security.SecUserVO; import nlib.user.service.LoginService; import nlib.user.service.NlibLoginVO; import nlib.util.StringUtil; +import nlib.util.UUID; /** *
@@ -404,4 +405,39 @@ public class NlibCommonController {
 		return StringUtil.isEmpty(value) ? defValue : value;
 	}
 	
+	/**
+	 * 세션에 CSRF 방지를 위한 토큰을 생성한다. 
+	 * 
+	 * @param request
+	 */
+	public final static String SESSION_CSRF_TOKEN_NAME = "SESSION_CSRF_TOKEN";
+	
+	public String generateCsrfToken(HttpServletRequest request) {
+		HttpSession session = request.getSession();
+		String token = UUID.getNewUUID();
+		session.setAttribute(SESSION_CSRF_TOKEN_NAME, token);
+		log.debug("generateCsrfToken > " + session.getAttribute(SESSION_CSRF_TOKEN_NAME));
+		
+		return token;
+	}
+	
+	/**
+	 * 입력받은 CSRF 토큰이 유효한지 확인한다. 
+	 * 
+	 * @param request
+	 * @param pToken
+	 * @return
+	 */
+	public boolean isValidCsrfToken(HttpServletRequest request, String pToken) {
+		
+		HttpSession session = request.getSession();
+		String sToken = (String)session.getAttribute(SESSION_CSRF_TOKEN_NAME);
+		
+		if(request == null || StringUtil.isEmpty(pToken) || StringUtil.isEmpty(sToken)) return false;
+		
+		if(sToken.equals(pToken)) return true;
+		
+		return false;
+	}
+	
 }
diff --git a/src/main/java/nlib/col/web/ReadController.java b/src/main/java/nlib/col/web/ReadController.java
index c3e76306..2faf1001 100644
--- a/src/main/java/nlib/col/web/ReadController.java
+++ b/src/main/java/nlib/col/web/ReadController.java
@@ -70,7 +70,7 @@ public class ReadController extends NlibCommonController {
      */
 	@Secured("ROLE_USER")
     @RequestMapping(value={"/read/confirmReadFromCart.do", "/read/confirmRead.do"})
-    public String confirmRent(HttpServletRequest request, CollectionVO readVO, ModelMap model) throws Exception {
+    public String confirmRent(HttpServletRequest request, CollectionVO readVO, String csrfToken, ModelMap model) throws Exception {
     	
     	String retJsp = "nlib/read/confirmRead";
     	boolean fromCart = request.getServletPath().contains("Cart.do");
@@ -82,11 +82,17 @@ public class ReadController extends NlibCommonController {
     		return retJsp;
     	}
     	
+    	if(!fromCart && !isValidCsrfToken(request, csrfToken)) {
+    		model.addAttribute("message", "잘못된 접근입니다.");
+    		return retJsp;
+    	}
+    	
     	if(readVO == null || StringUtil.isEmpty(readVO.getSelItems())) {
     		model.addAttribute("message", "대출(예약)신청할 정보가 없습니다.");
     		return retJsp;
     	}
     	
+    	
 		String selItems = readVO.getSelItems();
 		
 		List list = collectionService.makeInfoListOfCollectionVO(selItems, mbInfoId);
diff --git a/src/main/java/nlib/col/web/RentController.java b/src/main/java/nlib/col/web/RentController.java
index d6521dde..c723e23c 100644
--- a/src/main/java/nlib/col/web/RentController.java
+++ b/src/main/java/nlib/col/web/RentController.java
@@ -218,7 +218,7 @@ public class RentController extends NlibCommonController
 	
 	@Secured("ROLE_USER")
     @RequestMapping(value={"/rent/confirmRentFromCart.do", "/rent/confirmRent.do"})
-    public String confirmRent(HttpServletRequest request, CollectionVO rentVO, ModelMap model) throws Exception {
+    public String confirmRent(HttpServletRequest request, CollectionVO rentVO, ModelMap model, String csrfToken) throws Exception {
     	
     	boolean fromCart = request.getServletPath().contains("Cart.do");
     	
@@ -229,6 +229,11 @@ public class RentController extends NlibCommonController
     		return "nlib/rent/confirmRent";
     	}
     	
+    	if(!fromCart && !isValidCsrfToken(request, csrfToken)) {
+    		model.addAttribute("message", "잘못된 접근입니다.");
+    		return "nlib/rent/confirmRent";
+    	}
+    	
     	if(rentVO == null || StringUtil.isEmpty(rentVO.getSelItems())) {
     		model.addAttribute("message", "대출(예약)신청할 정보가 없습니다.");
     		return "nlib/rent/confirmRent";
diff --git a/src/main/java/nlib/sch/web/NlibSearchController.java b/src/main/java/nlib/sch/web/NlibSearchController.java
index 36abc021..232a804d 100644
--- a/src/main/java/nlib/sch/web/NlibSearchController.java
+++ b/src/main/java/nlib/sch/web/NlibSearchController.java
@@ -352,6 +352,12 @@ public class NlibSearchController extends NlibCommonController {
 			imagePath = StringUtil.getString(vo.getRprsThumbUrl(),"");
 		}
 		
+		// CSRF 토큰 생성 (2021.12.02 KKN 추가)
+		String token = generateCsrfToken(request);
+		model.addAttribute("csrfToken", token);
+		log.debug("searchItemDetail > token=" + token);
+		log.debug("searchItemDetail > session token=" + session.getAttribute(SESSION_CSRF_TOKEN_NAME));
+		
 		model.addAttribute("imageType",imageType);
 		model.addAttribute("imagePath",imagePath);
 		model.addAttribute("keywordList",keywordList);
diff --git a/src/main/webapp/WEB-INF/jsp/nlib/collection/searchItemDetail.jsp b/src/main/webapp/WEB-INF/jsp/nlib/collection/searchItemDetail.jsp
index 545135ff..fc8a27cb 100644
--- a/src/main/webapp/WEB-INF/jsp/nlib/collection/searchItemDetail.jsp
+++ b/src/main/webapp/WEB-INF/jsp/nlib/collection/searchItemDetail.jsp
@@ -1,3 +1,4 @@
+<%@page import="nlib.cmm.NlibCommonController"%>
 <%
 /**
  * 
@@ -35,6 +36,7 @@
 ${result.title}