Study/JSP

[JSP]세션(Session)과 쿠키(Cookie)

코챱 2022. 2. 10. 12:51

jsp에서 세션(session)과 쿠키(cookie)는 비슷하지만 다르다. 세션은 서버와 클라이언트가 연결되었을 때, 그 상태를 유지하기 위해서 서버 측이 관리하는 데이터다. 세션 객체는 브라우저마다 따로 생성(서버상)되며, 브라우저 내 여러 세션을 생성할 수는 있지만 세션이 늘수록 서버에 무리가 갈 수 있다. 또한 브라우저를 종료하면 사라지고 서버에서만 관리할 수 있어 보안의 이점이 있다.

쿠키는 반대로 클라이언트 측에서 관리되는 데이터이며, 브라우저가 종료된 후에도 특정 기간 동안은 사용 가능하다. 서버에만 존재하는 세션과 다르게 하드디스크 내에 저장되며, 그렇기 때문에 쿠키의 위치가 공개돼있어 보안에 취약하다. 대표적으로 로그인 창에서 '다음 로그인 시 아이디 저장' 이 쿠키를 사용한 예시다.

정리하자면 세션과 쿠키의 차이점은, 서버와 클라이언트 중 저장되는 위치, 페이지 종료 후 유지 여부라고 볼 수 있다. 참고로 하드디스크 내에서 쿠키 위치는 아래와 같고, AppData는 숨김 파일이다.

C:\사용자\내PC명\AppData\Local\브라우저명\User Data\Default\Cache\Cache_Data

 

세션(Session)

세션은 jsp의 영역객체들 중 하나이기 때문에 session.setAttribute("속성명", 값) 형식으로 생성하고, 사용할 때는 session.getAttribute("속성명") 으로 한다. 세션값 하나를 제거할 경우 session.removeAttribute("속성명"), 전체 제거는 session.invalidate() 으로 한다.

 

아래는 세션 객체를 이용한 로그인 처리다. 로그인 정보를 이렇게 저장하면, 브라우저가 열려 있고 세션이 만료되지 않는 한, 다른 페이지를 갔다 와도 로그인이 유지된다. 참고로 세션 유지 시간은 보통 30분이다.

먼저 form 태그로 id와 pw를 입력받아 Pro 페이지로 넘긴다. 입력값이 있어야 넘어가도록 return false를 설정한다.

입력받은 값과 DB에 저장된 값을 비교하여, id와 pw 모두 맞으면 세션값으로 저장 후 Main 페이지로 이동한다.

Main 페이지에서 세션값을 받아 환영 메시지를 출력하고, 로그아웃 버튼을 Logout 페이지로 연결시킨다.

여기서 removeAttribute는 세션값을 하나만 없애는 코드기 때문에, invalidate로 전체 제거를 해 준다. 그리고 다시 Main 페이지로 이동, 세션값이 null이 되었으니 Form 페이지로 돌아간다.

 

쿠키(Cookie)

쿠키를 사용하는 것은 세션과 비슷하게 서블릿 API 방식을 사용할 수도 있고, HTTP 헤더 정보를 이용할 수도 있다. 먼저 서블릿 API 방식을 통한 쿠키 생성은 Cookie 쿠키명 = new Cookie("이름", 값) 으로 하고, 쿠키 설정 세팅에는 쿠키명.setMaxAge(유지시간) 또는 setPath(디렉토리), setValue(값), setVersion(쿠키버전) 이 있다. 또한 쿠키값 저장은 response.addCookie(쿠키명) 으로 한다.

 

1. 서블릿 API 방식

아래는 쿠키값(서블릿 API)을 이용한 예시인데, 사용자(클라이언트)가 원하는 언어를 선택하면 페이지에 해당 언어가 적용되고, 페이지를 껐다 켜도 언어가 유지된다.

위 페이지에서 lan 값을 전송하면 아래 페이지에서 쿠키 생성(lang), 설정(setMaxAge), 쿠키값 저장(addCookie) 후 Form 페이지로 돌아간다. 쿠키의 주소값이 배열로 저장되고, 쿠키명이 lang일 때 쿠키의 속성값(kor / eng)을 변수 lang에 저장한다. 그리고 변수 lang 값을 확인하여 해당 언어대로 출력한다.

참고로 배열이 null이 아닌 경우에만 적용하게 해야 에러가 나지 않으며, radio 타입에서 변수 lang 값을 확인한 뒤 checked 되게 만들면, 전송을 누르거나 페이지를 껐다 켜도 300초 동안은 그 선택이 유지(쿠키 유지)된다.

 

참고로 쿠키를 삭제하고 싶을 때는 출력할 때와 비슷한 방식으로, 유지시간을 0으로 세팅해주면 된다.

Cookie cookies = request.getCookies();

if(cookies != null) {    //null이 아닐 때만 적용해야 함
	for(int i=0; cookies.length; i++) {
		if(cookies[i].getName().equals("쿠키명")) {

			cookies[i].setMaxAge(0);    //유지시간 0으로 세팅
			response.addCookie(cookies[i]);    //클라이언트로 쿠키 정보 보냄

		}
	}
}

 

2. HTTP 헤더 방식

다음으로 HTTP 헤더를 이용한 쿠키 사용 예시다. 팝업창에서 한 달간 안 보기를 선택하면, 한 달 동안 쿠키값을 유지하여 팝업창을 띄우지 않는 코드다.

위의 팝업창에서 checkbox로 한 달간 팝업창을 안 띄울지 선택받고, 만약 체크되었다면 쿠키(cookie)에 http 헤더 정보를 새로 저장한다. 이때 notShowPop은 임의로 작성했으며, notShowPop 값은 true로, 그리고 팝업창의 날짜 정보(expires)는 현재부터 한 달 뒤로 설정한 후 창을 닫는다.

팝업창에서 받아온 쿠키가 있다면 ; 기준으로 잘라 배열(cookie)에 저장, 다시 = 기준으로 잘라서 배열(element)에 저장한다. 그리고 정규식(replace)을 사용하여 공백 제거 후 element[1]의 값(true)을 리턴한다. 하지만 팝업창의 checkbox를 체크하지 않았다면 넘겨준 쿠키가 없기 때문에, 바로 result(false)를 리턴한다.

그렇게 리턴 받은 값을 페이지가 로드될 때 확인해서 false일 때만 팝업창을 띄우게 한다. 또한 쿠키가 만료되기 전에 팝업창을 다시 띄우고 싶을 때는 http 헤더의 notShowPop 값을 false로, expires 값을 -1로 바꿔서 적용해준다.