type="nal"
[Spring MVC]세션으로 로그인/로그아웃-게시판 구현 본문
이전에 스터디 게시판을 만들면서 스프링프레임워크 + jsp를 이용하면서 getSession을 이용해 로그인 하는 방법을 정리해보았다.
1. 기존 로그인 방법(아이디와 비밀번호 모두 확인)
이전 방법 : 회원의 고유값인 아이디로 회원정보를 검색해 정보를 모두 가져오려고 했었음
=> 이렇게 하면 해당하는 정보가 없을 수도 있기 때문에 member가 널값인지 검사해준다.
개선된 방법 : 아이디로 조회된 정보가 있고, 비밀번호가 일치하는 경우에 로그인을 진행한다.
2. 로그아웃 처리
로그아웃 시에는 기존 세션을 무효화하거나 제거해야 한다.
getSession(false)를 사용하면 세션이 존재하지 않을때 null을 반환하기 때문에 이를 조건으로 사용할 수 있다.
// 로그아웃 로직
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
getSession(true)와의 차이점은 아래와 같다.
메셔드 | 세션 반환 | 세션 없을 경우 | 사용 사례 |
getSession() | 기존 세션 반환 | 새 세션 생성 | 기본 세션 처리 (로그인 등 일반적 사용) |
getSession(true) | 기존 세션 반환 | 새 세션 생성 | 명시적으로 세션이 반드시 필요한 경우 |
getSession(false) | 기존 세션 반환 | null 반환 | 세션이 있을 때만 처리하고 없으면 무시 |
로그인한 상태일 때만 세션이 필요하고, 로그아웃시 세션을 아예 삭제해줬다.
3. 서비스에서 로그인 검사(캡슐화)
그런데 컨트롤러까지 비밀번호를 가져와서 검사하는 방식은 권장되지 않기 때문에 서비스 계층에서 회원정보를 검사하도록 기존 방식을 한단계 더 개선했다.
회원정보 조회 서비스 메서드
컨트롤러
4. 로그인시 알림메시지 뜨게 하는 법
메세지 정보를 로그인한 member객체와 함께 세션에 임시 저장한다. ""따옴표 안에있는게 공유할 이름
<!-- 로그인 알림메시지 -->
<script>
<c:if test="${not empty sessionScope.login_msg}">
alert('${sessionScope.login_msg}');
<c:set var="login_msg" scope="session" value="${null}" />
</c:if>
</script>
메인화면과 로그인화면에서 sessionScope를 이용해 검사.
request에 저장하면 리다이렉트면 어차피 사라지기 때문에 세션으로 저장,
그리고 일회성으로 메세지를 출력한 후 세션에서 제거한다.
c:set으로 메시지를 제거하는 로직은 아래와 같다. scope를 사용할땐 var속성을 필수로 사용해야 한다.
- var="login_msg": 세션에서 login_msg 속성을 지정
- scope="session": 세션 범위에서 속성을 수정
- value="${null}": 세션에서 login_msg 속성을 null로 설정하여 메시지를 제거