Cookie

JiMin LEE·2022년 11월 17일
0

로그인

목록 보기
3/7

Spring과 Cookie & Session

1️⃣ 쿠키

로그인 한 후 새로고침하면 로그인이 풀리지 않도록 어떠한 조치를 취해야 하는데,
그것이 바로 “Cookie”이다

  1. 서버를 클라이언트에게 사용자를 추적할 만한 정보를 쿠키로 만들어서 브라우저로 보낸다.
  2. 웹 브라우저에 쿠키를 저장해두었다가 클라이언트가 요청할 때마다 쿠키를 동봉해서 보내준다.
  3. 서버는 요청에 들어있는 쿠키를 읽어서 사용자가 누군지 파악한다.

2️⃣ 쿠키란?

: 웹 서버가 웹 브라우저에게 보냈다가 요청이 있을 때 저장되었다가 브라우저가 다시 서버로 보내주는 문자열 정보, 단순한 key-value 쌍이다.

쿠키의 위치

요청 시 : request.headers.cookie

응답 시 : response.writeHead

쿠키의 속성(attributes)

  • Name : cookie의 이름
  • Value : cookie의 값
  • Secure : secure HTTPS 연결에서만 cookie가 전송될 것인지의 여부
    • True → secure connection이 존재할 때만 cookie가 보내진다.
    • Default는 False!
  • Domain : Cookie의 domain name이다.
    • 설정한 도메인(Ex- test.com)의 모든 subdomain(ex- test/user.com)에서 이 쿠키가 이용가능하다.
    • www.test.com 처럼 설정하면 안 된다.
  • Path : 어떤 경로에서 cookie를 사용가능하게 할 지 지정하는 것
    • 예로 “/”로 설정하면 domain 내의 모든 경로에서 쿠키를 사용할 수 있다.
    • “/user/”로 설정하면 /user/와 그 아래 모든 sub directory에서 쿠키를 사용할 수 있다.
    • Default는 cookie가 만들어지는 경로이다.
  • HTTPOnly
    • True : HTTP 프로토콜을 통해서만 쿠키를 이용할 수 있다.
    • Default는 False
  • Expires : cookie가 언제 파기될 지 명시한다.
    • 초 단위이고 606024*30는 30일 뒤에 파기되는 것을 의미한다.
    • 이 값이 생략되거나 0으로 설정되면 session이 끝날 때 (브라우저 끌 때 )파기된다.

서버가 쿠키를 생성할 때, setCookie 함수를 사용하는데, Name, Value, Expires는 꼭 명시해야 한다!

쿠키 생성(구현)

  • 처음에 서버의 응답과 함께 사용자의 브라우저에 쿠키를 개발자가 직접 구현해야 한다.
    → set-cookie
@RequestMapping(value = path + "/login", method = RequestMethod.POST)
public String login(Model model, final HttpSession session,
                    HttpServletResponse response,
                    @ModelAttribute LoginInfo loginInfo)
{
    System.out.println(loginInfo.getId() + ", " +
                    loginInfo.getPassword() + ", " +
                    loginInfo.isStoreId());
    // 로그인 정보 확인
    UserDTO userDTO = userService.loginVerification(loginInfo.getId(), loginInfo.getPassword());
    if(userDTO == null) {
        model.addAttribute("errStr", "로그인 실패: 아이디 및 패스워드를 확인 해주세요.");
        return "redirect:/login_page";
    }
    // 쿠키 생성 및 설정
    if(loginInfo.isStoreId())
    {
				// 쿠키 객체 생성
        Cookie storeIdCookie = new Cookie("storeIdCookie", loginInfo.getId());
				// 쿠키 path 설정
        storeIdCookie.setPath(path + "/login_page");
				// 쿠키 유효기간 설정
        storeIdCookie.setMaxAge(60 * 60 * 24 * 30);
				// 쿠키 객체를 response에 넣어서 보냄
        response.addCookie(storeIdCookie);
    }
    // 세션 설정
    session.setAttribute(UserConfig.SESS_USER_UID, userDTO.getUid());
    session.setAttribute(UserConfig.SESS_USER_ID, userDTO.getId());
    session.setAttribute(UserConfig.SESS_USER_NAME, userDTO.getNickname());
    // expired in 10 minutes
    session.setMaxInactiveInterval(60 * 10);
    return "redirect:/";
}

쿠키 사용

@RequestMapping(value = path + "/login_page", method = RequestMethod.GET)
public String loginPage(Model model,
                        @CookieValue(value="storeIdCookie", required = false) Cookie storeIdCookie)
{
    LoginInfo loginInfo = new LoginInfo();
    if (storeIdCookie != null) // 쿠키가 null이 아니면
    {
        loginInfo.setId(storeIdCookie.getValue()); // loginInfo의 멤버 변수를 쿠키의 내용으로 바꾼다.
        loginInfo.setStoreId(true);
    }
    model.addAttribute("loginInfo", loginInfo);
    return "login_page";
}
  • @CookieValue(”key”) : 이 애노테이션을 붙인 변수를 파라미터로 넘기면 스프링이 해당 키 값을 가진 쿠키 값을 변수에 할당해 준다.
  • Value : cookie의 이름
  • required : 이 쿠키가 반드시 존재해야 하는지 여부
<h1>Login</h1>
<p>Please enter ID & password</p>
<!--/*@thymesVar id="errStr" type="java.lang.String"*/-->
<div th:if="${errStr != null}" th:text="${errStr}"></div>
<!--/*@thymesVar id="loginInfo" type="com.board.dtos.LoginInfo"*/-->
<form action="#" th:action="@{/user/login}" th:object="${loginInfo}" method="post">
    ID: <br/>
    <input type="text" th:field="*{id}" th:value="*{id}"/><br/>
    Password: <br/>
    <input type="password" th:field="*{password}"/><br/>
    <input type="checkbox" th:field="*{storeId}" th:checked="*{storeId}"/>ID 저장
    <br/><br/>
    <input type="submit" value="Login"/>
</form>
  • LoginInfo 객체를 controller로부터 넘겨 받아서 ID 입력 textbox와 ID 저장 checkbox에 멤버변수를 대입한다.
@RequestMapping(value="/some/path", method = RequestMethod.POST)
public void ResponseEntity<?> someMethod(HttpServletRequest request) {
    Cookie[] myCookies = request.getCookies(); // Request 속 쿠키를 리스트에 넣기

    for(int i = 0; i < myCookies.length; i++) {
System.out.println(i + "번째 쿠키 이름: " + myCookies[i].getName());
System.out.println(i + "번째 쿠키 값: " + myCookies[i].getValue());
    }
}

쿠키를 가져올 땐 HttpServletRequest 에서 가져오고, 설정할 땐 HttpServletRequest로 설정한다.

쿠키 제거

@RequestMapping(value="/some/path", method = RequestMethod.POST)
public void ResponseEntity<?> someMethod(HttpServletResponse response) {
    //원래 쿠키의 이름이 userInfo 이었다면, value를 null로 처리.
    Cookie myCookie = new Cookie("userInfo", null);
    myCookie.setMaxAge(0); // 쿠키의 expiration 타임을 0으로 하여 없앤다.
    myCookie.setPath("/"); // 모든 경로에서 삭제 됬음을 알린다.
    response.addCookie(myCookie);
}

0개의 댓글