개인 웹 프로젝트를 진행하면서 한 사용자가 게시글에서 새로고침을 할 때마다 조회수가 증가하는 일이 발생했다.
이를 방지하기 위해서 스프링에서 제공하는 @CookieValue를 사용해서 문제를 해결해보자.
쿠키의 개념
쿠키란 Http 프로토콜의 특징인 비연결 성과 상태 유지성의 단점을 보완하고자 상태 유지의 개념으로 사용되는 것으로,
사용자가 서버를 통해 특정 문서를 요청하면 쿠키가 생성되고, 사용자의 컴퓨터의 약 4KB, 도메인당 20개 가능하다.
쿠키는 세션과 반대되는 개념으로 클라이언트에게 정보를 저장하고, 서버의 부하를 줄일 수 있다. 하지만 크롬 브라우저에서 개발자 도구-Application탭에서 해당 쿠키의 값을 수정할 수 있기 때문에, 보안에 취약하다는 단점이 있어서, 비밀번호 등의 중요 개인정보는 세션에 관리하는 것이 옳다.
어노테이션(@CookieValue)
해당 어노테이션은 함수의 인자로 받아서 사용하면 된다.
쿠키의 생성은 Cookie cookie =new Cookie("key", Value);로 간단히 생성할 수 있는데,
어노테이션의 name 항목에 내가 받고자 하는 쿠키의 키를 일치시켜주면 된다.
쿠키 생성
@GetMapping("/index")
private String index(HttpServletResponse response) {
Cookie cookie =new Cookie("view",null); //view라는 이름의 쿠키 생성
cookie.setComment("게시글 조회 확인"); //해당 쿠키가 어떤 용도인지 커멘트
cookie.setMaxAge(60*60*24*365); //해당 쿠키의 유효시간을 설정 (초 기준)
response.addCookie(cookie); //사용자에게 해당 쿠키를 추가
return "root.index";
}
개인적인 웹 프로젝트의 일부인데, 사용자가 인덱스 페이지에 접속을 하면, 쿠키를 생성을 하고,
해당 쿠키를 근거로 게시글의 id값을 확인해서 중복 조건 처리를 한다.
쿠키 사용
@GetMapping("detail")
public String detail(@CookieValue(name = "view") String cookie, HttpServletResponse response,
@RequestParam(name = "cate") String category, @RequestParam(name = "id") int id, Model model)
throws ClassNotFoundException, SQLException {
System.out.println(cookie);
if (!(cookie.contains(String.valueOf(id)))) {
cookie += id + "/";
boarddao.hit(category, id);
}
response.addCookie(new Cookie("view", cookie));
List<Board> result = boarddao.getDetail(category, id);
model.addAttribute("result", result);
return "board.detail";
}
게시글을 조회할 때, 자세한 내용을 보여주는 함수이다.
코드에 보다시피 @CookieValue 어노테이션 name항목으로 아까 생성한 쿠키 이름과 일치시켜준다.
그렇게 되면 cookie라는 문자열 변수에 해당 값이 문자열 형태로 들어간다.
본인의 경우는 게시글의 id를 /로 구분했기 때문에 쿠키 값을 받아오면 1/2/3/4/5/ 이런 식으로 누적이 된다.
누적된 값 중에서 게시글의 id와 일치하는 값이 있으면 기존의 Value를 다시 view라는 쿠키에 OverWrite 해서 덮어써주고
누적된 값 중에 id와 일치하는 수가 없다면 누적해주고 OverWrite를 해준다.
완성 모습
크롬 개발자 도구 -Application탭을 켜면 view라는 이름으로 쿠키가 생성된 것을 알 수 있다.
게시글 중 19번 게시글을 클릭하고 조회수가 증가하는지 확인해보자
게시글 번호 19 현재 조회수 10
URL상의 id파라미터가 우측 view쿠키에 잘 누적된 것을 볼 수 있고,
조회수도 1이 잘 증가한 것을 볼 수 있다.
추가로
글의 내용 처음에 보안에 취약하다고 언급했는데, 개발자 도구에서 쿠키의 Value -우클릭을 하면 마음대로 수정을 할 수 있다.
되도록이면 개인적인 정보는 세션을 사용하도록 하자.
'Java' 카테고리의 다른 글
JAVA] Arrays 클래스를 이용해서 배열 정렬하기. (0) | 2020.09.08 |
---|---|
JAVA]크롤링을 이용하여 웹 텍스트 마이닝 사이트 만들기 (0) | 2020.08.11 |
An invalid character[44] was present in the Cookie value (0) | 2020.07.22 |
JAVA]String 문자열 함수들 (0) | 2020.06.25 |
Spring]Ioc란? (0) | 2020.06.17 |
댓글