Web Server - Cookie와 Session

Bloooooooooooooog..·2023년 4월 1일
0

웹페이지 구현 중 쿠키와 세션을 다룰 일이 있다. 둘 다 사용자의 정보를 유지시켜 기록하는 기능을 한다. 세션을 웹 서버 쪽의 스코프와 연관이 있고, 쿠키는 클라이언트 쪽, 즉 프론트 페이지에 저장시키는 역할을 한다.

HTTP환경은 기본적으로 stateless이기 때문에 쿠키와 세션 기술이 필요하다.

stateless

통신이 종료되면 연결을 끝는 특성이다. 만약 쿠키와 세션이 존재하지 않는다면 사용자는 매 페이지를 이동 시 로그인을 하고, 로그인 정보를 매번 입력하고, 이미 방문한 페이지의 반복되는 팝업 등을 봐야할 것이다.

쿠키는 key와 value로 이루어진, 클라이언트 로컬에 저장되는 데이터 파일이다. 쿠키는 300개까지 저장되며, 하나의 쿠키는 4kb까지 저장 가능하다.
클라이언트가 쿠키를 요청하면 서버는 쿠키를 http헤더에 포함시켜 전달하고 이는 클라이언트 단에 보관하고 있어 사용한다.

session

세션은 쿠키와 유사한 기능을 하지만, 클라이언트 단이 아닌 서버에서 내용을 보관하고 있다. 이 덕에 보안은 향상되지만 세션이 많아질수록 서버에 부하가 있게 된다. 따라서 로그인과 같은 보안이 중점적인 부분에서 세션을 사용하게 된다.

사용 예

		try {
			// 서비스 객체 생성
			MemberService service = new MemberService();
			
			// 이메일, 비밀번호가 일치하는 회원 조회하는 서비스 호출 후 결과 반환
			Member loginMember =service.login(mem);
			
			// 로그인 성공 / 실패에 따른 처리 코드
			
			// ** 로그인 ** 
			// ID/PW가 일치하는 회원 정보를 Session Scope에 세팅
			// Session 객체 얻어오기 
			HttpSession session = req.getSession();
			
			
			if(loginMember != null) { // 성공
				
				//회원 정보 Session 세팅
				session.setAttribute("loginMember", loginMember);
				
				// 특정 시간동안 요청이 없으면 세션 만료
				session.setMaxInactiveInterval(3600); // 1시간
				// -> 초단위로 작성
                
   //============================================================
				
				// 아이디 저장 (Cookie)
				
				// Cookie 사용 예

				//쿠키 객체 생성
				Cookie c = new Cookie("saveId", inputEmail);
				
				// 아이디 저장이 체크된 경우
				if(req.getParameter("saveId") != null) {
					// 쿠키 파일 30일 동안 유지
					c.setMaxAge(60 * 60* 24 * 30); //30일 (1초 단위)
					
				} else {
					// 쿠키 파일 0초 동안 유지
					// -> 기존에 존재하던 쿠키 파일이 유지시간을 0초 덮어씌움
					// == 삭제하겠단 소리
					c.setMaxAge(0);
					
				}
				// 해당 쿠키 파일이 적용될 주소를 지정
				c.setPath(req.getContextPath());
				// req.getContextPath() : 최상위 주소
				
				// 응답 객체를 이용해서 클라이언트로 전달
				resp.addCookie(c);
			}else { // 실패
				session.setAttribute("message", "아이디 또는 비밀번호가 일치하지 않습니다.");
			}
			
			// -> 리다이렉트시 request 객체가 유지되지 않기 때문에
			// 특정 데이터를 전달하거나 유지하고 시으면
			// session 또는 application 범위에 세팅해야한다.
			
			resp.sendRedirect(req.getContextPath());
			

		}catch(Exception e) {
			e.printStackTrace();
		
		}
profile
공부와 일상

0개의 댓글