<< 학습 목표 >>

1. 세션에 민감한 개인 정보를 저장할 수 있다.


전 글을 통해서 세션에 로그인 상태를 기록했음

그러나 사실 전 글처럼 단순한 데이터는 굳이 세션에 저장할 필요가 없음

쿠키에 저장해도 문제 없음

왜? 로그인에 성공했을 때 세션에 isLogin에 true 를 저장했는데 이는 로그인 성공 실패 여부만 나타내는 데이터이지 사용자와 관련된 민감한 개인 정보는 없음

아이디와 비밀번호를 저장한 것도 아니고 연락처나 주민등록 번호 등 유출 되면 큰 문제가 생기는 개인 정보를 저장한 게 아니기 때문에...

 

이번에는 로그인에 성공했을 때 반드시 세션에 저장해야하는 중요한 상태 정보를 저장해보자

로그인에 성공했을 때 세션에 로그인한 사용자의 정보 전체를 저장하자

만약 이를 쿠키에 저장했다면 해커가 쿠키를 통해 "음~ 로그인한 사용자의 아이디, 비밀번호는 이거군, 연락처는 저거군" 하면서 빼갈 수 있기 때문에 로그인한 사용자의 정보 전체는 반드시 세션에 저장해야함


구체적으로 우리는 로그인에 성공했다면 세션에 로그인한 사용자의 전체 정보(아이디, 비밀번호, 닉네임, 연락처)를 저장 할 것

 

세션에 무언가를 저장하는 역할은 컨트롤러가 하므로 로그인한 사용자의 전체 정보를 세션에 저장하려면 컨트롤러에서 해야함

그럼 우선 현재 컨트롤러를 분석해보자

1. 로그인 성공, 실패 여부를 판단하기 위해 아이디, 비밀번호를 담은 객체 생성

2. 로그인 성공, 실패 여부를 판단할 서비스 메서드로 아이디, 비밀번호를 담은 객체를 전달한 후 반환 값을 result 변수에 담음

3. 로그인에 성공했다면

4. 세션에 로그인 성공 상태 저장

 

여기서 바꿔야할 부분을 생각해보면 4번임

4. 세션에 로그인에 성공한 사용자의 전체 정보를 저장

 

로그인에 성공한 사용자의 전체 정보를 어떻게 저장할까?

로그인에 성공했을 때 컨트롤러가 알고 있는건 아이디, 비밀번호 뿐이므로 서비스 또는 DAO를 통해서 로그인에 성공한 사용자의 전체 정보를 받아와야함

 

컨트롤러의 주된 역할은?

더보기

1. 클라이언트의 요청을 받는다.

2. 파라미터(클라이언트가 보낸 값)를 꺼낸다.

3. 파라미터를 검증한다.

4. 클라이언트의 요청을 처리할 서비스 메서드를 호출한다.

5. 서비스 메서드가 반환한 처리 결과에 맞는 결괏값(+상태코드) 또는 결과 페이지를 응답한다.

 

따라서 로그인에 성공했을 때 서비스를 사용해 로그인에 성공한 사용자의 전체 정보를 가져오면 됨

그. 러. 나. 더 간단한 방법은 2번

 

로그인 성공, 실패 여부를 판단할 서비스 메서드로 아이디, 비밀번호를 담은 객체를 전달한 후 반환 값을 result 변수에 담음

 

에서 로그인 성공, 실패 여부를 판단할 서비스 메서드(correctIdNPw 메서드) 안으로 들어가보면 DAO에서 사용자의 전체 정보를 받아오고 있음

이 서비스 메서드가 boolean을 반환하는게 아닌 로그인에 성공했다면 사용자의 전체 정보를 반환하고 로그인에 실패했다면 null을 반환하도록 처리하는게 더 간단함

 

따. 라. 서 ! correctIdNPW 메서드의 반환 타입을 MemberDto로 바꾸고 로그인에 성공했다면 사용자의 전체 정보를 반환하고 로그인에 실패했다면 null을 반환하도록 바꾸자

멤버 서비스 클래스(member 패키지 -> MemberService 클래스) 내 correctIdNPw 메서드를 다음과 같이 수정

package member;

public class MemberService {
	public MemberDto correctIdNPw(MemberDto member) {
		MemberDao dao = new MemberDao();
		
		MemberDto selectedMember = dao.selectOneById(member.getId());
		if(selectedMember == null) {
			return null;
		}
		
		// 사용자가 입력한 비밀번호
		String userInputPw = member.getPw();
		// 사용자가 입력한 아이디로 조회한 회원 정보의 비밀번호
		String storedUserPw = selectedMember.getPw();
		
		if(!userInputPw.equals(storedUserPw)) {
			return null;
		} else {
			return selectedMember;
		}
	}
    
    ...
}

 

 

그 후 로그인 서블릿(member 패키지 -> MemberLogin 서블릿의 코드를 다음과 같이 수정하자

 

(1). 로그인 성공, 실패 여부를 판단하는 서비스가 이제 사용자 정보를 반환하므로 사용자 정보를 받을 수 있게 수정

(2). 로그인에 성공했다면 로그인에 성공한 사용자 정보를 저장하고 있으므로 조건식을 다음과 같이 변경

(3). 로그인에 성공했다면 로그인에 성공한 사용자 정보를 세션에 저장

728x90
LIST