2 분 소요

비밀번호 인코딩2

  • web.xml
  <servlet>
      <servlet-name>appServlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>
         			/WEB-INF/spring/appServlet/servlet-context.xml
    		 		 /WEB-INF/spring/appServlet/security-context.xml
         </param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
   </servlet>

security-context.xml을 읽을 수 있게 경로를 설정해준다

 


Membercontroller

	@Autowired
	private  BCryptPasswordEncoder pwEncoder;

의존성을 주입하기 위해 membercontroller에 어노테이션을 설정한다.


 

  • 회원가입 메소드
@RequestMapping(value = "/client-register", method = RequestMethod.POST)
	public String joinPOST(MemberVO member) throws Exception {

	
		  String rawPw =""; //인코딩 전 비밀번호 
		  String encodePw =""; //인코딩 후 비밀번호

인코딩이 되기전 비밀번호와 인코딩 후 비밀번호를 잠시 저장 시켜주는 변수를 선언한다.

		  rawPw = member.getPw(); //비밀번호 데이터를 얻음 
		  encodePw = pwEncoder.encode(rawPw);
		  //비밀번호를 인코딩 
		  member.setPw(encodePw); // 인코딩한 member객체를 다시 저장한다
		 
		service.memberjoin(member);

		return "redirect:/client-login";
	}

member 객체로 부터 비밀번호 데이터를 얻어내서 해당 비밀 번호를 인코딩한 후 member객체에 다시 저장한다.

인코딩한 비밀번호가 담긴 member객체를 memberjoin메소드에 호출 시켜 회원가입 쿼리를 실행하게 한다.

 

  • 로그인 메소드

이전 메소드

	if (vo == null) {
			// 일치하지 않는 아이디,비밀번호경우
			int result = 0;
			session.setAttribute("result", result); 

			return "redirect:/client-login";

		}

		// 일치하는 아이디, 비밀번호 경우 - 로그인 성공
		session.setAttribute("member", vo);
		System.out.println("로그인성공");

		// 로그인 id 확인
		System.out.println("id :" + member.getId());

		// 아이디 저장
		session.setAttribute("memberid", vo.getId());
		return "redirect:/client-main";
	}

이전의 쿼리문

<!-- 로그인하기 -->
	<select id="memberLogin" resultType="com.supermm.model.MemberVO">
		select id, name, mpoint, adminchk, money from member where id =
		#{id,jdbcType=VARCHAR} and pw=#{pw,jdbcType=VARCHAR}

	</select>

memberLogin 메소드를 사용하여 사용자가 입력한 아이디와 비밀번호가 일치하면 사용자의 데이터를 select문을 이용하여 가져오는 형태의 로그인을 설정 하였다.


 

인코딩이 된 후 사용자의 입력한 비밀번호와 데이터의 비밀번호가 일치하는 여부를 알 수 없기 때문에 null값이 반환된다.

따라서 데이터에서 사용자의 비밀번호를 가져와야한다.

비밀번호를 가져온 후 BcryptPasswordEncoder의 matches()메소드를 사용하여 사용자가 입력한 비밀번호와 데이터가 일치하는지 확인을 한다

 

MemberMapper.xml의 mapper을 변경해준다

  • MemberMapper.xml
<!-- 로그인하기 -->
	<select id="memberLogin" resultType="com.supermm.model.MemberVO">
		select id, pw, name, mpoint, adminchk, money from member where id =
		#{id} 

	</select>

 

  • membercontroller.java
@RequestMapping(value = "/client-login", method = RequestMethod.POST)
	public String loginPost(HttpServletRequest request, MemberVO member) throws Exception {

		// 세션 초기화하기
		HttpSession session = request.getSession();
		  String rawPw =""; //인코딩 전 비밀번호 
		  String encodePw =""; //인코딩 후 비밀번호
				// 두번쨰 변수 선언 - 값을 담을 변수

		MemberVO vo = service.memberLogin(member);

session을 사용하기 위해 session 변수를 선언하고 request.getSession()으로 초기화한다.

회원가입과 마찬가지로 인코딩이 되기전 비밀번호와 인코딩 후 비밀번호를 잠시 저장 시켜주는 변수를 선언한다.

메소드를 호출시켜 쿼리문을 사용한다. 쿼리문을 사용하여 받은 결과값을 vo에 저장한다.


		if (vo != null) {// 일치하는 아이디가 존재시
			
			rawPw = member.getPw(); //비밀번호 데이터를 얻음 
			encodePw = vo.getPw();//데이터 베이스에 저장한 인코딩된 비밀번호
			
			if(true ==  pwEncoder.matches(rawPw, encodePw)) {
				vo.setPw("");
				session.setAttribute("member", vo);
				return "redirect:/client-main";
			
			}else {
			
				session.setAttribute("result", 0);
				return "redirect:/client-login";
	
			}

matches(인코딩전 비밀번호, 인코딩 후 비밀번호) 메서드가 true를 반환하는지 않는지 조건문을 작성 한다.

vo.setPw(“”):인코딩 되었더라도 비밀번호를 노출 시킬 필요가 없기때문에 session에서 VO에게 사용자의 정보를 저장하기 전에 비밀번호를 지워준다.

로그인 실패시 else구문에 실행 되어야할 코드를 작성한다.




		 } else {

		session.setAttribute("result", 0);
		return "redirect:/client-login";
	}
	
}

아이디가 없을 시 실행 되어야할 코드 또한 작성한다.

댓글남기기