Spring interceptor AutoLogin

채상혁·2022년 2월 12일
0

Spring

목록 보기
9/18

자동 로그인 구현

로그인 화면 jsp 파일 쪽에서
자동 로그인 체크 여부를 가져온후 객체 리터럴 방식으로 id,pw,autoLogin 정보를 담아줍니다.

	//로그인 요청 처리
	@PostMapping("/loginCheck")
	public String login(@RequestBody UserVO vo,
						/*HttpServletRequest request*/HttpServletResponse response,
						HttpSession session) {
		System.out.println("/user/loginCheck: POST");
		System.out.println("param:" + vo);
		
		//서버에서 세션 객체를 얻는 방법
		//1.HTTPservletRequest 객체 사용
//		HttpSession session =  request.getSession();
		
		//2.매개값으로 HttpSession 객체 받아서 사용
		
		BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
		
		UserVO dbData = service.selectOne(vo.getAccount());
		//Mybatis는 조회된 값이없으면 null 이온다.
		if(dbData != null) { //raw 비밀번호랑 비교한다; 암호화된것이랑.
			if(encoder.matches(vo.getPassword(),dbData.getPassword())) {
				//로그인 성공 회원을 대상으로 세션 정보를 생성.
				session.setAttribute("login", dbData);
				
				long limitTime = 60 * 60 * 24 * 90;
				
				//자동 로그인 체크 시 처리해야 할 내용
				if(vo.isAutoLogin()) {
					//자동 로그인을 희망하는 경우
					//쿠키를 이용하여 자동 로그인 정보를 저장.
					System.out.println("자동 로그인 쿠키 생성 중...");
					//세션 아이디를 가지고 와서 쿠키에 저장(고유한 값이 필요합니다)
					Cookie loginCookie = new Cookie("loginCookie",session.getId());
					loginCookie.setPath("/"); //쿠키가 동작할 수 있는 유효한 url
					loginCookie.setMaxAge((int)limitTime);
					response.addCookie(loginCookie);
					
					//자동 로그인 유지 시간을 날짜 객체로 변환.(DB에 삽입하기 위해, 밀리초.)
					long expiredDate = System.currentTimeMillis() + (limitTime * 1000);
					//Date 객체의 생성자에 매개값으로 밀리초의 정수를 전달하면 날짜형태로 변경해 줍니다.
					Date date = new Date(expiredDate);
					
					System.out.println("자동 로그인 만료시간:" + date);
					
					service.keepLogin(session.getId(), date, vo.getAccount());
				}
				
				return "loginSuccess";
			} else {
				return "pwFail";
			}
		} else {
			return "idFail";
		}
		

에서 autoLogin이 체크되어있을 경우 Cookie를 생성합니다.

Cookie loginCookie = new Cookie("loginCookie",session.getId());
					loginCookie.setPath("/"); //쿠키가 동작할 수 있는 유효한 url
					loginCookie.setMaxAge((int)limitTime);
					response.addCookie(loginCookie);

인터셉터의 preHandel() 을 이용하여 loginCookie가 있는지 확인합니다.

//원하는 쿠키의 값을 한방에 꺼내오실 수 있습니다.(request객체, 쿠키이름)
		Cookie loginCookie = WebUtils.getCookie(request, "loginCookie");
		
//자동 로그인 신청한 사람이라면 로그인 유지를 위해 세션 데이터를 만들어 줘야함.
		HttpSession session = request.getSession(); 
		if(loginCookie != null) { //자동로그인을 이전에 신청한 유저구나.
			
			// 2.DB에서 쿠키값(세션ID)와 일치하는 세션ID를 가진 회원의 정보를 조회
			UserVO vo = mapper.getUserWithSessionId(loginCookie.getValue());
			System.out.println("쿠키의 값:" + loginCookie.getValue());
			System.out.println("DB에서 가져온값:" + vo);
			if(vo != null) {
				//자동 로그인 신청한 사람의 로그인 데이터(세션)을 만들어 줍시다.
				session.setAttribute("login", vo);
				System.out.println("세션 제작 완료");
				
			}
		}
		//true 이면 컨트롤러로 요청이 들어가고, false 면 요청을 막습니다.
		//자동 로그인 신청 여부와 상관없이 홈 화면은 무조건 봐야 하니까 true를 작성.
		return true;

이런식으로 작성합니다.

하지만 로그아웃 버튼을 클릭하여도 로그인이 유지가 되는데 이런 경우에는 자동 로그인 쿠키가 있는지 확인하여 쿠키가 존재한다면 수명을 0, DB를 조작해주어야 합니다. 만료시간 : new Date().

Cookie loginCookie = WebUtils.getCookie(request, "loginCookie");
	
		if(loginCookie != null) {
			loginCookie.setMaxAge(0);
			loginCookie.setPath("/");
			response.addCookie(loginCookie); //쿠키는 클라이언트 쪽에 
			service.keepLogin("none", new Date(), user.getAccount());
		}
		//자동 로그인 해제 방법.

0개의 댓글