본문 바로가기

Programming/SERVER

DAY 117. MVC2 패턴 - 로그아웃 기능

MVC2 패턴을 활용하여 회원가입 페이지를 만들 때 사용했던 구조 하나하나에 대한 기록 작성

 

로그아웃

 

01. header.jsp

- 로그아웃 buttondp onclick 이벤트를 건다.

<button onclick="location.replace('${ path }/logout')">로그아웃</button>

- 연습에서는 get 요청이지만 post로 구현해도 된다.

 

 

02. LogoutServlet.java

- mvc > member > controller 밑에 생성

- 로그아웃 기능을 처리할 서블릿을 만든다.

1) 로그아웃 버튼을 누르면 세션 정보를 삭제한다.

     - request.getSession(false);

     - 현재 세션 객체가 있으면 가져오고 없으면 null을 리턴하도록 한다.

     - false가 없거나 true는 상태에서는 -> 세션 객체가 아예 없으면 새로 만들어서 가져온다. 그러면 로그인 정보를 없애기 위해서 세션을 삭제하는 이유가 없어지기 때문이다.

     - session.invalidate(); : 세션을 삭제하는 메소드

2) 삭제 후 메인 화면으로 리다이렉트 시킨다.

 

 

- 보안 상의 문제 때문에 아이디 관련 정보는 session에 저장하지만, "아이디 저장"과 같은 기능은 쿠키(클라이언트 쪽에 정보를 저장)를 활용해서 관리한다. 

- 보관할 시간을 정할 수 있다.

 

03. header.jsp

- 아이디 저장을 위한 <input type="checkbox"> 에 name이나 id 속성을 지정하여 이용한다.

 

 

04. LoginServlet.java

- 로그인할 때, 체크 박스에 value 값을 지정하지 않고 체크하면 on 으로, 체크하지 않으면 null로 리턴된다.

- 로그인이 성공했을 때, 아이디를 저장할 것인지 아니면 로그인 시도할 때 아이디 저장할지는 기획할 때 정한대로 구현하면 된다.

- 현재 전달된 아이디를 쿠키에 저장할지, 기존 쿠키 값을 삭제할지 비즈니스 로직을 구현한다.

- 쿠키를 객체로 만들어보자. (key, value) 형태로 저장, Cookie (javax.servlet.http)

- 쿠키 유지 시간을 지정 후 response 객체에 쿠키를 추가한다.

// 쿠키 유지 시간 지정

cookie.setMaxAge(-1);
// 브라우저가 종료될 때까지 쿠키를 저장 = 세션 쿠키

// 그 외에는 초단위로 시간을 지정
cookie.setMaxAge(259200); // 3일 유지


// response 객체에 쿠키 추가
response.addCookie(cookie);

 

05. header.jsp

- 아이디 저장 체크박스 기능 구현

:  <input type="checkbox"> 에 속성을 추가한다. 만약에, 세션 쿠키가 존재하면 로그인 단계에서 사용자가 아이디 저장 체크박스에 체크를 했다는 이야기이기 때문에, 로그인 할 때, 아이디 저장 체크 박스에 checked 가 되어 있도록 하는 것. (세션 쿠키를 개발자 도구에서 지우고 시도하면 checked 되어 있지 않는다.)

<input type="checkbox" name="saveId" ${ empty cookie.saveId ? "" : "checked" }>

 

 

- 아이디 자동 완성 기능 구현

: 세션 쿠키가 존재하면 로그인 단계에서 사용자가 아이디 저장 체크박스에 체크를 했다는 이야기이기 때문에, 세션 쿠키에 저장되어 있는 값을 가져와서 아이디 입력을 위한 input 태그에 넣어준다.

<input type="text" value="${ empty cokkie.saveId ? '' : cookie.saveId.value }" required>

 

 

06. LoginServlet.java

- 아이디 저장하는 쿠키의 값이 null일 경우, 기존 쿠키 값을 삭제한다.

- 동일한 key 값을 가지는 쿠키 객체를 생성하고 유지 시간을 0으로 설정하면 된다.

- 즉, 아이디 저장을 체크하지 않고 로그인했다가 로그아웃 하면 아무런 흔적도 남지 않는다.