[backend] 세션과 쿠키

객체 바인딩 한 이유는 회원 가입 성공하면 다른 객체들도 회원가입 성공한 걸 알아야 하기 때문.


MemberDAO dao=new MemberDAO();
		String user_name=dao.memberLogin(vo); // 구현
		// user_name에 값이 있으면 인증에 성공한것이고, user_name에 값이 없으면 회원인증이 실해한 경우

		if(user_name !=null && !"".equals(user_name)) {
			// 성공

			//request.setAttribute("aaaa", "aaaa");
			HttpSession session=request.getSession();			
			session.setAttribute("userId", user_id);
			session.setAttribute("userName", user_name);			
		}else {
			// 실패
			request.getSession().setAttribute("userId", "");
			request.getSession().setAttribute("userName", "");
			request.getSession().setAttribute("msg", "사용자 정보가 올바르지 않습니다.");		
		}		
		return "redirect:"+ctx+"/memberList.do";


세션객체 하나 만들 수 있고 Http 세션 만들어서 이걸 가져오는게 getSession이다 그리고 userid의 로그인이 성공하면 그 아이디가 유저 아이디가 유저 네임에 setAttribute되고 객체바인딩이 됨.

회원 인증 확인해보려면 세션객체를 가지고 와서 userid에 있는 값을 꺼내와야된다.

한개의 PC에서 브라우저 두개를 띄우면 일단 서버입장에선 2명이 접속한거로 세션개념에선 이

20210618_120003

로그인 성공했으면 이 기록을 읽어서 서비스 되고 실패했으면 다시 로그인 할수 있도록 로그인페이지로 돌아가야.

특정 메모리에 있는걸 가져가서 인증 성공하면 서비스 되야되는데 없으면 로그인 안된거니까 다시 로그인 페이지 가야됨.


세션이란 무엇인가

앞전에 리퀘스트( 클라이너트가 맨처음에 요청하면) 리퀘스트와 리스폰스가 만들어지고 객체를 바인딩 하고 다른 페이지로 포워딩 하게 되면 이 객체에 바인딩 된 메모리 공간에 가져가서 getAttribute하면 이 객체에 바인딩 된 메모리공간에 가져가서 A페이지에선 회원가입 성공했다고 하고 가져가는데 리퀘스트는 가져갈 수 없음.

리퀘스트 객체 리퀘스트 객체에 바인딩 하고 넘겨줄떄만 사용가능. 이게 리퀘스트 바인딩 포워딩이다.

20210618_145444

이 jsp는 뺴내갈 수 있고 그럼 A에서 인증하고 맞으면 서비스 하고 아니면 서비스 안하고 리턴한다(다시 되돌린다.)

쿠키 = 흔적(과자를 먹으면 흔적이 남음) 쿠키라는 이름으로 매일 학원에 방문한 적이 있음.(처음 바움ㄴ시엔)

클라이언트가 서버 요청해서 식별하기 위해 수강권을 만들어서 클라이언트에 줌.

20210618_150519

수강권도 있고 수강권에 해당하는 서버에 캐비넷도 있음. 이 캐비넷은 수강 번호가 있어야만 사용가능.

이 캐비넷을 쓰려면 수강 번호를 알고 있어야 사용이 가능하다.

클라이언트와 서버쪽에서 뭔가 연결이 되어있다 이걸 인지하자. 그리고 이걸 세션이라고 한다.

처음 방문시엔 수강번호가 없었는데, (만들어서 줌) 처음이 아니라 두번쨰,세번쨰 네번쨰 이렇게 방문하면.

20210618_150737

홍길동이 학원에 올때 이제 아이디를 가져와야 한다.(수강번호)

이 클라이언트에서 만들어진 쿠키 정보를 서버쪽으로 가져와야된다.

이 정보가 바로 request 객체에 담아진다.

번호만 같으면 홍길동은 캐비넷 마음대로 쓸 수 있다.

김길동도 마찬가지.

수강 번호만 알면 그대 서버로 가면 자기꺼 캐비넷 뺴곰 ㅏ음대로 할 수 있다.

이 메모리 공간에 SetAttribute 해주고 다른 곳에서 얼마든지 쓰게 된다.

나길동, 조길동이 가진 페이지들은 먼저 번호 만들어져야 되는데 이미 번호가 만들어져 있으면 java100이라는걸 가지고 갈 수 있다.

20210618_153947


클라이언트가 서버입장에선 처음방문했는지 아닌지 확인해야할 필요가 있다.

20210618_162154

20210618_162204

왼쪽은 세션이 있을텐데 오른쪽은 없어서 세션을 쓸 수 없을거 그럼 버튼 클릭했을떄 세션이 무조건 서버로 날아가니까 세션을 가진 메모리에서 꺼내서 쓸 수 있다.

로그인을 성공하면 객체 바인딩해야된다. 메모리 만들어줘야 되기때문에 세션이 그 전에 만들어져있는지 파악해야된다.

리퀘스트 요청하면 HttpSeervletRequest와 Response가 생성되며 이걸 getsession 하게 된다.

이게 있으면 이미 만들어져 있으면 이 세션객체를 다시 가리키게 한다.

기존에 만들어져 있으면 가리키게 한다.

get세션 먼저 해서 만들어져 있으면 계속 거기 쓰면 된다.

처음부터 getSession 해보는 거다.

20210618_162204

쿠키로 클라이언트로 브라우저에 내려보내는 것 까지 getSession이 한다. 이 세션에서 리퀘스트 이쓴지 보고 없으니까 새로 만들고 이 클라이언트와 세션이 성립 되는건지 본다.

20210618_165901

쿠키로 내려보내는거 까지 세션이 한다.

쿠키로 브라우저에 보관시키도록 내려보냄. getSession이 하고 이 세션에서 테스트해보고 없으니까 세션 넣어서 세션 아이디로 구해준다음에 내려보내주면 세션이 성립이 된다.

이 세변수에 담아서 가리켜야 한다.

이렇게 가리키면 세션이 다 만들어진다.

회원 인증에 성공을 하면 세션을 만들어서 여기에 성공했다는 사실을 저장한다.


A.jsp, B.jsp, C.jsp 이런게 있다 가정하면

session.getAttribute로 아이디가 되어있는 세션이 있으면(널이 아니면) get세션 열어서 회원인증여부 파악한다.

단 클라이언트가 동일해야된다.

동일한 브라우저인 경우에만 가능.

클라이언트가 서버 요청하게 되면 또하나가 만들어짐.

20210618_171040

여기서 session 100은 session100인 메모리 공간 쓰고 세션 200인 브라우저는 session200인 메모리 공간을 쓴다.

20210618_171806

모든 페이지가 상태 인증했는지 비교하면서 확인하는게 상태인증 방법.


클라이언트가 서버에 요청했을떄 요청 정보들이 담긴 곳이 Request이다.

package kr.bit.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MemberLogoutController implements Controller{

	@Override
	public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 세션을 가져와서 세션을 제거
		// 세션을 제거하는 방법
		// 1. 강제로
		String ctx=request.getContextPath();  // MVC06
		request.getSession().invalidate();
		// 2. 브라우져를 종료하는것(JSESSIONID 브라우져쿠키에 저장)
		// 3. 세션이 종료될때까지 기다리는 것(세션타임아웃 : 30분=1800초)
		return "redirect:"+ctx+"/memberList.do";
	}

}


세션 타임아웃 설정되어있음(톰캣 서버에) web.xml아래보면 세션에 대한 타임 아웃이 나와있다.





© 2021.03. by yacho

Powered by github