[Spring] 회원가입, 로그인 비밀번호 암호화 처리

리트리버J

·

2020. 11. 7. 09:05

728x90
// 1. pom.xml에 비밀번호 암호화 관련 dependecny를 추가해준다.

<!-- ******* 비밀번호 암호화  ******* -->
<!-- core,web,config 이렇게 3가지의 라이브러리 필요 -->
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-core</artifactId>
   <version>5.2.1.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-web</artifactId>
   <version>5.2.1.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
   <groupId>org.springframework.security</groupId>
   <artifactId>spring-security-config</artifactId>
   <version>5.2.1.RELEASE</version>
</dependency>
<!-- ********************** -->

// 2. web.xml에 spring-security bean객체가 담길 xml파일 경로를 설정해준다.
// root-context.xml의 경로처럼 원하는 경로를 설정해주고, 그 경로에 파일을 만들어준다.

<context-param>
   <param-name>contextConfigLocation</param-name>
   <!-- root-context.xml을 소스폴더 최상위 패스("src/main/resources" => classpath) -->
   <param-value>
      classpath:root-context.xml
      classpath:spring-security.xml
   </param-value>
</context-param>

// 3. web.xml의 context-param의 param-value에 설정한 경로에
XML file이 아닌, Spring Bean Configuration File로 파일을 만들고
확장자를 .xml로 만들어준다.


// 4. XSD를 security을 체크하고 하단의 spring-security.xsd를 클릭해준다.


// 5. 이렇게 beans가 설정되어 나오는데

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:security="http://www.springframework.org/schema/security"
   xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-5.1.xsd
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

</beans>

// 6. <beans>안에 bean객체를 등록해준다.
// id값과 Controller의 변수명은 동일해야 한다(?)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:security="http://www.springframework.org/schema/security"
   xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-5.1.xsd
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
      
   <!-- bcryptPasswordEncoder -->
   <bean id="bcryptPasswordEncoder"
   class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
</beans>


// 7. Controller를 등록해준다.

@Autowired
private BCryptPasswordEncoder bcryptPasswordEncoder;
   
/**
   * 4. 회원가입 메소드
   * @param u
   * @param model
   * @return
   */
@RequestMapping("uinsert.do")
public String insertMember(User u, Model model) {

   System.out.println("암호화 전 : " + u);
   u.setPwd(bcryptPasswordEncoder.encode(u.getPwd()));
   System.out.println("암호화 후 " + u);
   
   // 이제 서비스로 이동
   int result = uService.insertMember(u);
   if(result > 0) {
      return "redirect:index.do";
   }else {
      model.addAttribute("msg","회원가입실패");
      return "common/errorPage";
   }
}

// 8. Service, Dao를 등록한다.

-----------------------------------------------------------------------------------

암호화된 비밀번호 로그인 처리


1. bcryptPasswordEncoder객체의 mathces메소드의 파라미터로
좌항은 입력받은 비밀번호, 우항은 암호화된 User객체의 비밀번호를 넣어준다.
반환값은 boolean형이기 때문에 true / false를 반환한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @param u
* @param model
* @return 
*/
@RequestMapping(value="login.do",method=RequestMethod.POST)
public String userLogin(User u, Model model) { // view에 전달하는 데이터를 Model에 담는다.
    
    User loginUser = uService.loginUser(u);
                                                        // 입력 비밀번호   , 복호화 비밀번호
    if(loginUser != null && bcryptPasswordEncoder.matches(u.getPwd(), loginUser.getPwd())) {
        // model은 request영역이다. 그것을 상단의 @SessionAttributes가 session영역으로 바꿔준다.
        // request → session
        model.addAttribute("loginUser",loginUser); 
        return "redirect:index.do";
    }else {
        model.addAttribute("msg""로그인 실패!");
        return "common/errorPage";
    }
}
cs


2. myBatis의 mapper.xml 파일도 변경해주어야 한다.
암호가 맞는지 틀린지는 if문에서 비교하기 때문에, ID만 비교하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 로그인 -->
<select id="loginUser" parameterType="Member" resultMap="MemberResultSet">
    <!-- 암호화 전 -->
    SELECT *
    FROM MEMBER
    WHERE ID = #{id}
    AND PWD = #{pwd}
    AND M_STATUS = 'Y'
    
    <!--  암호화 후 -->
    SELECT *
    FROM MEMBER
    WHERE ID=#{id}
    AND M_STATUS='Y'
</select>
cs


728x90