쿠키와 세션

이진아·2020년 5월 29일
0
  • 쿠키는 local pc 브라우저에 저장됨
  • 쿠키에 담긴 데이터는 네트워크를 통해 전달되기 때문에 보안성이 낮음

1) 쿠키 생성

: 웹 서버 측에서 쿠키를 생성하여, 응답 데이터의 헤더에 저장해서 웹 브라우저에 전송

2) 쿠키 저장

: 웹 브라우저는 쿠키 저장소에 text 형태로 쿠키를 저장

3) 쿠키 전송

: 웹 브라우저는 요청이 있을 때 마다 저장한 쿠키를 웹 서버에 전송, 웹 서버는 그 쿠키를 사용해 필요한 작업 수행

※ 쿠키 생성 및 삭제 시 주의할 점
: 쿠키가 생성된 경로의 상위 경로에서는 쿠키가 삭제 불가!
: 쿠키가 생성된 경로 및 하위 경로의 쿠기만 삭제 가능!

Ex) /ch09/cookie 에서 생성했다면, setPath(/ch09)나 setPath(/)된 쿠키는 삭제 불가
Ex) /ch09 에서 생성했다면, setPath(/)경로는 삭제 불가

!!!!! setpath() 주의

Cookie cookies[] = request.getCookies();//모든 쿠키들을 가져와서
if(cookies!=null&&cookies.length>0){
	for(int i=0; i<cookies.length; i++){
    	if("cookieName".equals(cookies[i]).getName){
        	Cookie cookie = cookies[i];
            	cookie.setMaxAge(0);
                cookie.setpath("/");//***생성해줄 때 setpath한 값과 동일해야!!
            	res.addCookie(cookie);
        }
    }
}

4) 쿠키관리 클래스

public class CookieMgr {
	
	private Map<String,Cookie> cookieMap = new HashMap();
	
	//생성자
	public CookieMgr(HttpServletRequest req) {
		Cookie cookies[] = req.getCookies();
		if(cookies!=null&&cookies.length>0) {
			for(int i=0; i<cookies.length; i++) {
				Cookie cookie = cookies[i];
				cookieMap.put(cookie.getName(), cookie);
			}
		}
	}
	
	//=============================================================== 쿠키 얻기
	//해당 이름을 가진 쿠키가 있는가
	public boolean exist(String name) {
		return cookieMap.get(name)!=null;
	}
	//이름으로 쿠키 얻기
	public Cookie getCookie(String name) {
		return cookieMap.get(name);
	}
	//이름으로 쿠키값 얻기
	public String getValue(String name) throws IOException{
		return URLDecoder.decode(cookieMap.get(name).getValue(), "utf-8");
	}
	
	//=============================================================== 쿠키 생성
    //쿠키 수정, 쿠키 삭제도 생성으로 가능!!
	public static Cookie createCookie(String name, String val) {
		Cookie cookie = new Cookie(name,val);
		return cookie;
	}
	public static Cookie createCookie(String name, String val, String path) throws IOException{
		Cookie cookie = new Cookie(name,URLEncoder.encode(val, "utf-8"));
		cookie.setPath(path);
		return cookie;
	}
	public static Cookie createCookie(String name, String val, String path, int maxAge) throws IOException{
		Cookie cookie = new Cookie(name,URLEncoder.encode(val, "utf-8"));
		cookie.setPath(path);
		cookie.setMaxAge(maxAge);
		return cookie;
	}
	public static Cookie createCookie(String name, String val, String path, int maxAge, String domain) throws IOException{
		Cookie cookie = new Cookie(name,URLEncoder.encode(val, "utf-8"));
		cookie.setPath(path);
		cookie.setMaxAge(maxAge);
		return cookie;
	}
	
	//=============================================================== 쿠키 제거
	public boolean removeCookie(String name) {
		cookieMap.remove(name);
		return !exist(name);
	}

}

2. 세션 session

  • 세션은 웹브라우저가 아니라 서버의 캐쉬메모리에 저장됨
  • 서버에 저장되는 것이기에 보안에 강함
  • 캐쉬메모리는 휘발성이 강하며, 저장할 수 있는 메모리가 크지 않음
  • 세션을 사용한다는 것은 session 기본 객체를 사용한다는 의미
  • 세션은 여러 서버에서 공유할 수 없지만, 쿠키는 여러 도메인 주소에 공유할 수 있음!

1) 세션 생성

① 디폴트 → <%@ page session="true"%>

session.setAttribute("name", "val"); 

② request.getSession() → <%@ page session="false"%>

//현재 요청과 관련된 session 객체를 리턴
HttpSession session = request.getSession();
//만약 session이 존재하지 않으면 새롭게 생성해서 리턴!
//request.getSession(false)를 실행하면 존재하지 않을 경우, null을 리턴!
session.setAttribute("name", "val");

2) 세션에서 값 꺼내기

Object object = session.getAttribute("name");

3) 세션 종료

① 세션 종료

session.invalidate();

② 세션에서 값 제거

session.removeAttribute("name");

4) 세션 유효 시간

  • 세션을 사용하도록 설정되 JSP 페이지에 접근할 때마다 세션의 최근 접근 시간이 변경됨
//최근에 session 객체에 접근한 시간 
session.getLastAccessedTime()
  • 세션 유효 시간 설정 방법
    : 별도록 정하지 않을 경우, invalidate 메서드를 호출하기 전까지 세션 객체 유지
    → 메모리 부족 현상 발생!

① web.xml

<session-config>
	<session-timeout>50<session-timeout>//50분
</session-config>

② 메서드

session.setMaxInactiveInterval(60*60);//60분

※ 연관된 정보 저장을 위한 클래스 작성
: 연관된 정보를 클래스로 묶어서 저장하면 각 정보를 개별 속성으로 저장하지 않고 한개의 속성을 이용하여 저장 가능!

[문제점]

String memberId = session.getAttribute("memberId");
String name = session.getAttribute("name");
String email = session.getAttribute("email");      
...
//만약 이메일 정보가 필요하지 않아 저장하지 않은 경우, NullPointException 발생 가능성!!

[해결방법]

//연관 정보를 저장할 클래스 별도로 관리
public class MemberInfo{
    private String id;
    private String name;
    private String email;
    //getter, setter 메서드
}
   
//==============================================
//저장
<%
   MemberInfo memberInfo = new MemberInfo();
   memberInfo.setId("memberId");
   memberInfo.setName("name");
   memberInfo.setEmail("email");
   session.setAttribute("memberInfo",memberInfo);
%>
//꺼내오기
<%
   MemberInfo memberInfo = (MemberInfo)session.getAttribute("memberInfo");
%>
...
<%= memberInfo.getId()%>
//NullPointException 발생 막을 수 있음
  

0개의 댓글