Session & Cookie

EUNJI LEE·2023년 6월 11일
0

Servlet/JSP

목록 보기
8/9

HTTP 프로토콜의 동작과 정보 유지의 필요

웹 서비스는 HTTP 프로토콜을 이용한다. HTTP 프로토콜은 클라이언트의 요청을 개별적으로 관리하는데 사용자가 요청을 보내면 응답을 하고 해당 서비스의 연결은 해지하게 된다는 거다. 그래서 request에 저장된 내용을 이어서 쓰기 위해서는 request 자체를 보내서 사용해야 하고 요청을 남겨둘 필요가 없는 상황에서 sendRedirect를 이용해서 응답을 보낸 후 새로운 요청을 받아서 사용하게 된다.

이처럼 클라이언트는 한 페이지에 접속해서 꾸준히 자신의 정보를 저장한 상태로 사용하고 있는 것 같지만 내부적으로는 요청과 응답이 계속 실행되면서 사용자의 접속이 계속 해서 바뀌고 있다는 것이다. 접속이 계속 바뀌면 우리는 로그인한 정보를 계속해서 유지할 수도 없고 최근 본 상품 같은 정보도 계속해서 불러올 수 없게 된다. 사용자의 대한 정보가 유지 되지 않기 때문에 어떤 정보를 유지해야 하는지 알 수 없기 때문이다.

그래서 HTTP 프로토콜의 이런 특성을 해결하기 위한 방법으로 이전 요청에서 생성된 상태 정보를 유지할 수 있는 저장소가 필요해지는데 이때 사용하는 저장소를 Session과 Cookie이다.

Cookie

쿠키는 웹 서버에 의해서 생성되고 클라이언트의 쿠키 저장소에 저장된다. 하나의 도메인에서 생성할 수 있는 쿠키의 수와 크기는 브라우저마다 상이하다.

쿠키를 생성하는 프로그램을 웹 서버에 요청하면 웹 서버가 해당 프로그램을 실행하면서 쿠키를 실행하고 클라이언트에게 전달하게 된다. 전달된 쿠키는 클라리언트의 쿠키 저장소에 저장된다. 저장된 쿠키는 클라이언트가 요청을 보낼 때 URL을 전송하면서 함께 전송되는데, 이때 클라이언트는 여러 개의 쿠키를 가지고 있어도 쿠키는 해당하는 주소의 웹 서버로만 전송된다.

예를 들어 A주소에서 생성된 쿠키는 B주소에 요청을 보낼 때는 전송되지 않는다는 것이다.

name(key), value

쿠키는 이름과 값으로 구성되는데 여러 개의 쿠키가 존재할 수 있기 때문에 이름(name)은 유일한 값을 가져야한다. 쿠키의 이름은 아스키 문자로만 생성 가능하며 생성된 이름은 변경할 수 없다. 쿠키를 생성할 때 쿠키의 name과 value를 매개변수로 받아서 생성한다.

유효 시간

쿠키를 유지하는 유효 시간을 지정할 수 있다. 쿠키는 기본적으로 브라우저가 종료되면 쿠키가 소멸되지만 지정된 유효 시간이 지나지 않았다면 쿠키를 유지할 수 있다. 지정된 유효 시간이 안 됐더라도 쿠키를 삭제해서 지우는 것도 가능하다.

javax.servlet.http.Cookie 클래스를 이용해서 쿠키 객체를 생성해서 사용한다. Cookie 객체를 생성하고 나면 response 객체의 addCookie() 메소드를 사용해서 쿠키를 전송한다.

//쿠키 생성 후 저장시키기
Cookie c=new Cookie("cookieName","cookieValue");
c.setMaxAge(60*60*24); //cookie유지 기간을 지정 가능 초*분*시
response.addCookie(c);
		
response.sendRedirect(request.getContextPath());

getCookies() : 클라이언트가 전달한 모든 쿠키를 추출해서 Cookie 배열로 반환하는 메소드이다.

getName() : 쿠키의 이름을 String으로 반환하는 메소드이다.

getValue() : 쿠키의 값을 String으로 반환하는 메소드이다.

//저장된 쿠키 전부 가져와서 name, value를 하나씩 출력
		Cookie[] cookies=request.getCookies(); //Cookie객체 배열로 저장됨
		if(cookies!=null) {
			for(Cookie c:cookies) {
				System.out.println(c.getName()); //name값
				System.out.println(c.getValue()); //value값
			}
		}

쿠키 삭제는 유효 시간을 지정하는 setMaxAge() 메소드를 통해서 삭제할 수 있다.

💡 setMatAge()?
해당 메소드의 매개변수 값으로 양수, 음수, 0을 지정할 수 있고 음수는 기본 값으로 브라우저 종료 시 쿠키가 삭제될 때 사용한다. 양수인 경우 초 단위로 시간을 나타내고 0인 경우 쿠키는 바로 삭제된다.

name은 동일한 값을 가질 수 없으므로 동일한 name값이 있는 경우 덮어쓰기 된다. 따라서 삭제할 쿠키와 동일한 name의 cookie객체를 생성하고 setMaxAge(0)으로 설정한다. 전체 삭제가 필요한 경우 쿠키 배열을 받아와서 반복문으로 전체 쿠키를 삭제해줄 수 있다.

//cookie 삭제
//삭제할 쿠키와 동일한 key의 cookie객체를 생성하고 setMaxAge(0)으로 설정한다.
//key는 동일한 값을 가질 수 없으므로 동일한 key값이 있는 경우 덮어쓰기 된다.
Cookie c=new Cookie("cookiedata","");
c.setMaxAge(0);
response.addCookie(c);
response.sendRedirect(request.getContextPath());

Session

세션도 정보를 유지하고 있다는 점에서 쿠키와 비슷한 역할을 한다. 세션도 쿠키와 마찬가지로 key:value 형식으로 정보를 저장해서 유지한다.

세션과 쿠키의 차이점은 정보의 저장 위치에 있다. 쿠키는 클라이언트의 정보를 유지하는 것으로 클라이언트의 저장 공간에 만들어지기 때문에 보안 취약하지만 세션은 저장 공간 자체가 서버이기 때문에 사용자가 수정 불가하고 보안에 유리하다는 것이다.

세션은 브라우저를 사용해서 JSP 문서를 실행할 때 세션이 생성된다. 세션은 실행 중인 브라우저가 종료될 때까지 유지 되고 같은 도메인에서 유지 되면서도 같은 브라우저 내에서 실행 되는 모든 문서들에서 세션을 공유한다.

Session 생성

서블릿에서 세션을 사용할 때는 HttpSession 객체를 생성해야 한다. HttpSession 객체는 HttpServletRequest의 getSession() 메소드를 이용해서 생성할 수 있다.

💡 getSession()
해당 메소드는 매개변수로 boolean형을 받는다. true를 주는 경우 기존에 생성된 세션 객체가 존재하면 반환하고 없으면 새로운 세션 객체를 생성해서 반환한다.
false를 주는 경우에는 기존에 생성된 세션 객체가 존재하는 경우에만 세션 객체를 반환하고 없는 경우에는 null을 반환한다.
매개변수를 생략하고 사용하는 경우 true를 준 것과 동일한 기능을 한다.

JSP에서 세션을 생성할 때는 HttpSession 객체를 생성할 필요가 없다. JSP 문서가 서블릿으로 변환 되면서 getSession() 메소드에 의해서 객체가 생성되기 때문이다. JSP 문서가 서블릿으로 변환 되면서 내부 코드에 session=pageContext.getSession(); 을 실행한다.

Session 속성

쿠키에서 addCookie() 메소드를 이용해서 정보를 유지하는 것처럼 세션에서는 세션 속성을 이용해서 정보를 유지할 수 있다.

setAttribute(String name, String value) : 세션 속성을 key:value 형식으로 저장할 수 있는 메소드이다.

getAttribute(String name) : 저장한 세션의 name을 가지고 value값을 String으로 반환 받을 수 있는 메소드이다.

removeAttribute(String name) : 저장한 세션의 name을 가지고 해당 세션을 삭제할 수 있는 메소드이다.

HttpSession session=request.getSession(true);
session.setAttribute("data", "sessionData"); //session 속성 생성
String sessionValue=session.getAttribute("data"); //"sessionData"를 반환
session.removeAttribute("data"); //data라는 이름의 session 속성 삭제
response.sendRedirect(request.getContextPath());

Session 유효 시간

쿠키의 유효 시간은 생성 시 설정하지만 세션의 유효 시간은 생성 시점이 아니라 세션에 마지막으로 접근한 시간을 기준으로 지정된다. 마지막으로 접근한 시간을 기준으로 유효 시간 내에 다시 세션에 접근하지 않으면 세션이 종료된다.

서블릿 혹은 JSP에서 지정

서블릿이나 JSP 파일에서 세션의 유효 시간을 지정할 때는 setMaxInactiveInterval(int time) 메소드를 사용한다. 유효 시간을 확인하려면 getMaxInactiveInterval() 메소드를 사용하면 된다. 유효 시간을 지정할 때는 매개변수로 초 단위를 지정한다.

session.setMaxInactiveInterval(10); //10초 동안 유지되는 세션

이때 다른 JSP 파일에서 유효 시간이 지나서 삭제된 세션에 유효 시간을 확인하기 위해서 getMaxInactiveInterval()를 사용하면 1800이라는 숫자를 확인할 수 있다. web.xml에서 설정되어있는 톰캣의 기본 유효 시간이 30분이기 때문이다.

💡 다른 JSP 파일에서 session에 접근해서 getMaxInactiveInterval() 메소드를 실행하면 세션이 삭제된 이후라서 NullPotinException이 발생할 것 같지만 아무런 문제 없이 실행된다. 세션이 삭제된 뒤에 JSP 파일을 다시 새로 고침 하면 내장 되어있는 session에 접근하기 때문에 지정한 session 속성은 확인해도 null값이 나오겠지만 NullPointException은 발생하지 않게 된다.

web.xml에서 지정

어플리케이션이나 톰캣의 web.xml 문서에서도 지정이 가능하다. <session-config> 태그와 <session-timeout> 태그를 사용해서 유효 시간을 지정한다. 이때 어플리케이션 web.xml에서 지정하면 어플리케이션 내의 모든 세션에 적용되고 톰캣의 web.xml에서 지정하면 해당 서버에 있는 모든 세션에 시간이 적용된다.

세션의 유효 시간 지정도 지정하는 방법에 따라 setMaxInactiveInterval() > 어플리케이션 > 톰캣 순서로 우선 순위를 가진다.

참고 티스토리 : https://hahahoho5915.tistory.com/32
참고 서적 : 실습을 위주로 학습하는 Servlet & JSP 프로그래밍

profile
천천히 기록해보는 비비로그

0개의 댓글