▸JSP & Servlet/기본 문법

쿠키 이용 시 유의 사항 (자동로그인 로직 구현 등)

코데방 2020. 2. 23.
728x90

실제로 자동 로그인을 구현하는 과정에서 문제가 생겨서 꽤나 헤맸습니다. 간단히 같은 루트 내에 뷰(JSP)파일들을 다 넣고 해보면 별로 느끼지 못할 수 있는데 실제로 패키지 및 폴더 구조를 복잡하게 구성해보면 쿠키 사용에서 생각지 못한 문제가 발생했습니다.

 

쿠키의 기본 개념과 사용법은 아래 링크에서 보시면 됩니다.

 

2020/02/18 - [· JSP & Servlet/- 기본 문법] - 쿠키(Cookie)

 

 

로그인 페이지에서 로그인을 할 때 자동로그인을 체크하면 쿠키를 생성하고, 메인화면에서 계속 쿠키 또는 세션을 확인하다가 로그아웃 버튼을 누르면 쿠키를 찾아서 제거해주는 간단한 로직입니다. 문제는 쿠키의 '저장 위치'에서 나왔습니다. 대략 로그인은 아래 로직과 같습니다.

 

 

 

 

로그인 정보를 담아서 전달해주는 페이지는 "/join/login.jsp" 입니다. 루트가 아닌 "/join"폴더 하위에 있습니다. 따라서 response 객체에서 addCookie() 메소드를 실행해 쿠키를 첨부해주면 "/join/~~" URL 위치에 쿠키가 저장됩니다. 리다이렉트할 경우 response 객체가 요청한 곳으로 돌아갔다가 다시 리다이렉트할 곳을 요청하기 때문입니다. 혹시 리다이렉트에 대한 개념이 모호하신 분은 아래 링크글을 참조하시면 됩니다.

 

[· JSP & Servlet/- 기본 문법] - sendRedirect 작동 방식 및 예외 처리에서의 사용

 

 

즉, 루트("/")나 다른 URL("/userInfo") 형식에서 요청을 보낼 경우 해당 request 객체 안에는 로그인에서 첨부했던 쿠키가 없게 됩니다. request 객체의 getCookies() 메소드는 특정 URL(URI)에서 요청할 때 따라 들어온 쿠키 객체를 반납받습니다. 쿠키가 저장된 URL 형식과 다른 곳에서 온 request 객체에는 그 쿠키가 없습니다. 대략 아래 그림과 같은 구조로 작동하게 됩니다.

 

 

 

 

이 경우에 쿠키의 유효 경로를 수동으로 설정해줌으로써 문제를 해결할 수 있습니다. setPath() 메소드는 쿠키가 저장될 URL의 경로를 설정할 수 있습니다. setPath("/")는 절대 경로 지정을 뜻하며 루트 폴더를 의미하기 때문에 쿠키가 루트 URL 경로에 저장되고, 하위 폴더에서는 모두 사용할 수 있게 됩니다. 아래와 같이 작동합니다.

 

				Cookie cookie = new Cookie("userID", userID);
				cookie.setMaxAge(60*2);
				cookie.setPath("/");	// 쿠키 저장 위치
				response.addCookie(cookie);

 

 

 


 

 

위와 같이 원하는 곳에 쿠키 지정을 하는 부분이 해결됐습니다. 하지만 이번에는 또 로그아웃 과정에서 문제가 발생했습니다. 도무지 쿠키가 지워지질 않아 로그아웃이 되지 않는 문제가 발생합니다. 아래와 같은 코드로 로그아웃을 처리했습니다. 세션도 지워주고 쿠키가 있다면 쿠키도 지워준 뒤 response 객체에 실어줍니다.

 

		if (cookie != null) {
			for (int i = 0; i < cookie.length; i++) {
				if (cookie[i].getName().equals("userID")) {
					cookie[i].setMaxAge(0);
					response.addCookie(cookie[i]);
					break;
				}
			}
			request.getSession().invalidate();
			return Ctrl.TRUE;
		}
		

 

 

 

기존 쿠키 객체를 수정해서 리턴하는 것으로 잘 못 생각하고 있었던 것이 문제였습니다. 있던 쿠키 객체를 도로 가져와서 유효시간만 setMaxAge(0)으로 무효화시킨 것이니, 해당 쿠키 객체가 가지고 있던 Path 정보는 그대로 있을 것이라고 생각한 것이죠.

 

하지만 이 경우에도 Path 설정을 다시 해줘야 정상 작동이 되는 걸 확인했습니다. 경우에 따라서는 Path 설정 없이도 작동할 수 있겠지만, 실제 서비스를 구성하게 되면 폴더와 패키지 구조가 많이 복잡해지기 때문에 항상 절대경로 지정을 통해 Path가 꼬이는 것을 방지하는 것이 좋을 것 같습니다. 아래와 같이 setPath("/") 설정을 한줄 추가해주면 정상 작동하게 됩니다.

 

		if (cookie != null) {
			for (int i = 0; i < cookie.length; i++) {
				if (cookie[i].getName().equals("userID")) {
					cookie[i].setMaxAge(0);
					cookie[i].setPath("/"); // 패스 설정
					response.addCookie(cookie[i]);
					break;
				}
			}
			request.getSession().invalidate();
			return Ctrl.TRUE;
		}

 

728x90

댓글

💲 추천 글