1. 로그아웃
1.1 예제 코드
@WebServlet("/logout")
public class LogOutController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
if(session.getAttribute("loginInfo") != null){
session.removeAttribute("loginInfo");
session.invalidate();
resp.sendRedirect("/todo/list");
}
}
}
1.2 invalidate()
session.invalidate();는 Java의 서블릿 프로그래밍에서 사용되는 코드로, 현재 사용자의 세션을 무효화하는 함수입니다. 즉, 이 메소드를 호출하면 현재 세션에 저장된 모든 데이터가 제거되고, 세션이 종료됩니다. 주로 웹 어플리케이션에서 사용자가 로그아웃할 때 사용하여, 로그인 상태를 유지하는 데 필요한 세션 정보를 안전하게 지울 수 있게 해줍니다. 이로써 보안을 강화하고, 다른 사용자가 같은 세션 정보를 재사용하는 것을 방지할 수 있습니다.
1.3 removeAttribute()
session.removeAttribute("loginInfo"); 코드는 Java 서블릿에서 사용자의 세션에서 특정 속성을 제거하는 데 사용됩니다. 여기서 "loginInfo"는 제거하려는 세션 속성의 이름입니다.
이 메소드를 사용하면 세션에서 "loginInfo"라는 이름으로 저장된 데이터를 삭제할 수 있습니다. 그러나 이 코드는 세션 자체를 무효화하지는 않습니다. 따라서 이 메소드를 호출한 후에도 세션은 계속 유효하며, 다른 속성들은 그대로 남아있게 됩니다.
session.removeAttribute("loginInfo");는 주로 사용자가 로그인 정보만 세션에서 제거하고 싶을 때 사용되며, 세션의 다른 정보는 보존하고 싶을 때 유용합니다. 예를 들어, 사용자가 로그인은 해제하되, 세션에 저장된 다른 설정이나 선택사항은 유지하고 싶은 경우에 사용할 수 있습니다.
2. 스코프(Scope)
웹 애플리케이션에서 사용되는 데이터를 저장하고 관리하는 여러 종류의 스코프(scope)가 있습니다. Java 서블릿과 JSP를 기준으로, 데이터를 저장하는 네 가지 주요 스코프는 다음과 같습니다:
- Page Scope:
- 페이지 스코프는 하나의 JSP 페이지 내에서만 유효합니다. 즉, 해당 JSP 페이지가 처리되는 동안에만 변수에 접근할 수 있습니다. 페이지가 처리를 마치고 응답을 보내면, 페이지 스코프에 저장된 데이터는 소멸됩니다.
- 페이지 스코프에 데이터를 저장하면, 해당 데이터는 다른 페이지나 요청에서는 접근할 수 없습니다.
- Request Scope:
- 리퀘스트 스코프는 한 번의 클라이언트 요청을 처리하는 동안에만 유효합니다. 한 요청 내에서 포워드되는 여러 JSP나 서블릿 간에 데이터를 공유할 수 있습니다.
- 요청이 처리를 마치고 클라이언트에 응답을 보내면, 리퀘스트 스코프에 저장된 데이터도 소멸됩니다.
- Session Scope:
- 세션 스코프는 특정 클라이언트와 서버 사이의 한 세션 동안 유효합니다. 사용자가 웹 브라우저를 열어 로그인하는 순간부터 브라우저를 닫거나 로그아웃할 때까지의 기간 동안 데이터를 유지할 수 있습니다.
- 사용자별로 데이터를 저장하고 관리할 때 주로 사용되며, 로그인 정보, 사용자 설정 등을 저장하는 데 유용합니다.
- Application Scope:
- 어플리케이션 스코프는 웹 애플리케이션 전체에 걸쳐 공유되며, 웹 애플리케이션이 시작될 때 생성되어 애플리케이션이 종료될 때까지 유지됩니다.
- 모든 사용자와 모든 요청에서 공유되는 데이터를 저장하기 위해 사용됩니다. 예를 들어, 애플리케이션의 구성 설정이나 공통 데이터 등을 저장할 때 사용됩니다.
3. 웹 로그인에서 쿠키 처리 과정
1. 사용자가 로그인 폼에 정보 입력
- 사용자는 웹 애플리케이션의 로그인 폼에 자신의 아이디와 비밀번호를 입력합니다.
2. 로그인 요청 전송
- 로그인 폼에서 입력된 데이터는 서버로 전송됩니다. 이 때 HTTPS 프로토콜을 사용하는 것이 일반적으로 권장되어 정보가 암호화되어 전송됩니다.
3. 서버에서 사용자 인증
- 서버는 받은 아이디와 비밀번호를 데이터베이스의 저장된 정보와 비교하여 사용자를 인증합니다.
4. 세션 생성 및 세션 쿠키 발급
- 인증이 성공하면 서버는 사용자의 세션을 생성합니다. 이 세션은 서버의 메모리 또는 세션 서버/데이터베이스에 저장될 수 있습니다.
- 서버는 생성된 세션 ID를 클라이언트에게 세션 쿠키 형태로 전송합니다. 이 쿠키는 클라이언트의 브라우저에 저장되며, 이후 클라이언트가 서버에 요청을 보낼 때마다 이 세션 ID가 포함되어 서버에 전송됩니다.
5. 사용자 쿠키 설정 (선택적)
- 필요에 따라 서버는 사용자의 특정 선호도나 설정을 저장하기 위해 추가적인 사용자 쿠키를 생성하고 이를 클라이언트에 전송할 수 있습니다.
- 예를 들어, "자동 로그인" 같은 기능을 구현할 때 사용자의 인증 토큰을 쿠키에 저장할 수 있습니다.
- 오늘 봤던 Todo의 tno를 저장할 수 있다.
6. 클라이언트에서 쿠키 저장
- 클라이언트의 브라우저는 이 쿠키들을 받아 저장하고, 이후 서버에 요청을 보낼 때마다 이 쿠키들을 HTTP 요청 헤더에 포함시켜 전송합니다.
7. 세션 ID를 통한 세션 복구 및 사용자 인증
- 서버는 클라이언트로부터 받은 세션 ID를 통해 해당 사용자의 세션을 찾아내고, 이 세션 정보를 사용하여 사용자가 인증된 상태인지 확인합니다.
8. 로그인 유지
- 서버와 클라이언트 간에 세션 쿠키를 이용하여 사용자가 로그인한 상태를 유지합니다. 사용자가 로그아웃하거나 세션 쿠키가 만료되면 서버에서 해당 세션 정보를 삭제합니다.
이렇게 로그인 과정에서 쿠키와 세션은 사용자 인증을 유지하고, 서버와 클라이언트 간의 상태를 일관되게 유지하는 데 중요한 역할을 합니다. 서버는 쿠키를 통해 클라이언트를 식별하고, 필요한 정보를 안전하게 저장하여 웹 애플리케이션의 보안성을 향상시킬 수 있습니다.
4. 쿠키 만들기
4.1 쿠키 예제 코드
@Log4j2
@WebServlet(name = "todoReadController", urlPatterns = "/todo/read")
public class TodoReadController extends HttpServlet {
private TodoService todoService = TodoService.INSTANCE;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try{
Long tno = Long.parseLong(req.getParameter("tno")); //tno를 list.jsp에서 받아옴
TodoDTO todoDTO = todoService.selectOne(tno);
req.setAttribute("dto", todoDTO); //todoDTO를 read.jsp에 전달함
Cookie viewTodoCookie = findCookie(req.getCookies(), "viewTodo"); //쿠키 생성
String todoListStr = viewTodoCookie.getValue(); //쿠키의 value값을 todoListStr에 문자열로 받아옴
boolean exist = false; //viewTodo 키값을 갖는 쿠키가 있는지 확인하는 변수
if(todoListStr != null && todoListStr.indexOf(tno+"-")>=0){ //문자열 메서드 indexOf는 매개변수의 인덱스 값을 반환한다. 하나라도 있으면 정수값을 반환하므로 >=0 조건을 갖는다.
exist = true;
}
if(!exist){ //목록에 없으므로 처음 보는 것
todoListStr += tno+"-";
viewTodoCookie.setValue(todoListStr); //viewTodoCookie의 value값을 갱신한다.
viewTodoCookie.setPath("/"); //쿠키 값의 적용 범위 설정
viewTodoCookie.setMaxAge(60*60*24); //쿠키 값의 적용 시간 설정
resp.addCookie(viewTodoCookie); //response에 쿠키 값을 추가한다.(F12를 누르면 쿠키값이 추가되어 보인다), setAttribute와 유사함
}
req.getRequestDispatcher("/WEB-INF/todo/read.jsp").forward(req, resp); //read.jsp 페이지를 연다.
}catch (Exception e){
e.printStackTrace();
log.error(e.getMessage()); //에러가 있다면 콘솔창에 표시한다.
throw new ServletException("read error"); //ServletException에 read error 메세지를 보낸다.
}
}
private Cookie findCookie(Cookie[] cookies, String cookieName){
Cookie resultCookie = null; //반환 받을 값 선언.
if(cookies != null && cookies.length >0){ //쿠키가 이전에 만들어졌다면
for(Cookie ck : cookies){
if(ck.getName().equals(cookieName)){ //쿠키의 value값(Name)과 cookieName이 같은 것이 있는지 체크한다.
resultCookie = ck; //해당 쿠키를 resultCookie에 저장해 반환한다.
break;
}
}
}
if(resultCookie == null){ //todoCookie가 만들어지지 않았다면
resultCookie = new Cookie(cookieName, ""); //중복되지 않았으므로 새로운 쿠키를 만들어 반환한다.
resultCookie.setPath("/"); //쿠키 설정, 쿠키 설정 가능한 경로
resultCookie.setMaxAge(60*60*24); //하루 만큼 쿠키를 유지하겠다. 60초*60분*24시간
}
return resultCookie;
}
}
- 쿠키는 request에서 getCookies메서드로 반환 받을 수 있다.
- 쿠키는 Cookie[] 클래스 배열로 받는다.
- 쿠키는 getName() 메서드로 키(Cookie이름, 문자열 타입)을 받을 수 있다.
- 쿠키는 key, value값을 갖는다.
4.2 쿠키 설정
4.2.1 setPath()
- resultCookie.setPath("/"); 코드는 서블릿이나 JSP 등의 Java 웹 애플리케이션에서 쿠키의 경로(path)를 설정하는 데 사용됩니다. 이 구문은 쿠키가 클라이언트에게 전송될 때 해당 쿠키가 웹 애플리케이션 내의 어떤 URL 경로에서 접근 가능한지를 지정합니다.
- setPath("/")를 호출하는 경우, 쿠키의 경로가 "/"로 설정됩니다. 이는 쿠키가 해당 웹 애플리케이션의 루트 디렉토리와 그 하위 디렉토리에서 모두 접근 가능함을 의미합니다. 즉, 이 쿠키는 도메인 내의 모든 경로에서 유효하며, 사용자가 도메인 내 어느 페이지에 있든지 간에 그 쿠키는 서버로 전송될 수 있습니다.
- 예를 들어, 웹 사이트의 도메인이 example.com 이라고 할 때, resultCookie.setPath("/");로 설정된 쿠키는 example.com 의 모든 하위 페이지(예: example.com/products, example.com/about 등)에서 접근할 수 있습니다.
- 이 설정은 특히 로그인 세션을 유지하거나, 사용자 전체 네비게이션 경험을 개인화하는 데 사용되는 쿠키를 관리할 때 유용합니다. 사용자가 사이트의 어느 부분에서나 일관된 사용자 경험을 가질 수 있도록 하기 위해 널리 사용됩니다.
4.2.2 setMaxAge()
- setMaxAge() 메서드의 사용 방법:
- setMaxAge(int expiry)
- expiry: 쿠키의 최대 수명을 초 단위로 지정합니다.
- setMaxAge(int expiry)
- 매개변수 expiry의 다양한 값과 그 의미:
- 양수 값:
- 쿠키가 해당 초 수만큼 유효하게 됩니다. 예를 들어, setMaxAge(3600)은 쿠키가 3600초(1시간) 동안 유효하다는 것을 의미합니다. 이 시간이 지나면, 쿠키는 자동으로 만료되어 더 이상 클라이언트에 의해 서버로 전송되지 않습니다.
- 0:
- 쿠키를 즉시 만료시킵니다. 이는 주로 사용자가 로그아웃할 때 사용되며, 쿠키를 삭제하는 효과를 가집니다. 쿠키의 setMaxAge(0)을 설정하고, 변경된 쿠키를 클라이언트로 다시 전송하면 클라이언트는 해당 쿠키를 삭제합니다.
- 음수 값:
- 쿠키가 브라우저 세션이 종료될 때까지만 유효합니다. 즉, 사용자가 브라우저를 닫으면 쿠키도 함께 사라집니다. 이는 주로 일시적인 정보를 저장할 때 사용됩니다. setMaxAge(-1)은 쿠키가 세션 쿠키임을 의미하며, 브라우저가 열려 있는 동안에만 유지됩니다.
- 양수 값:
4.3 쿠키 확인하기
- 페이지에서 F12를 누른다.
- Application 탭을 누른다.
- Cookies에 해당 도메인을 누른다.
- Name값을 보고 원하는 쿠키값을 찾는다.
댓글