본문 바로가기
Spring

[웹프로젝트] 7. 회원가입(3) - 암호화 후 로그인

by moca7 2024. 10. 29.

 

 

ㅁ 회원가입을 암호화해서 지금 로그인이 안되는 상태다.

- 지금 쿼리는 아이디와 비번으로 찾고 있는데, 실제 db에 저장된 비번은 암호문이기 때문에 평문값으로 조회할 수가 없다.

- 평문을 암호화해서 조회할 수도 없다. SHA 방식은 가능. 그러나 BCrypt 방식은 똑같은 평문을 암호화할 때마다 ㅁ배번 다른 암호문 나오기 때문에 그렇게는 불가능하다.

- 우선은 아이디 가지고 조회를 한다.

그리고 b~에서 제공하는 특정 메소드를 사용해서 평문값과 암호문값이 일치하는지 비교해볼 수 있다.

 

암호화 적용 전 쿼리

 

 

 

 

 

ㅁ member-mapper.xml

 

 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="memberMapper">

  <resultMap id="memberResultMap" type="MemberDto">
    <result column="user_no" property="userNo" />
    <result column="user_id" property="userId" />
    <result column="user_pwd" property="userPwd" />
    <result column="user_name" property="userName" />
    <result column="email" property="email" />
    <result column="gender" property="gender" />
   
    <result column="phone" property="phone" />
    <result column="address" property="address" />    
    <result column="profile_url" property="profileURL" />
    <result column="signup_date" property="signupDt" />
    <result column="modify_date" property="modifyDt" />
    <result column="status" property="status" />                                        
  </resultMap>


  <!-- 로그인(암호화 적용 전)
  <select id="selectMember" resultMap="memberResultMap">
      select
             user_no
           , user_id
           , user_pwd
           , user_name
           , email
           , gender
           , phone
           , address
           , profile_url
           , signup_date
           , modify_date
           , status
        from member  
       where status in ('Y', 'A')
         and user_id = #{userId}
         and user_pwd = #{userPwd}
  </select> -->

  <select id="selectMember" resultMap="memberResultMap">
      select
             user_no
           , user_id
           , user_pwd
           , user_name
           , email
           , gender
           , phone
           , address
           , profile_url
           , signup_date
           , modify_date
           , status
        from member  
       where status in ('Y', 'A')
         and user_id = #{userId}
  </select>
 
 

  <!-- 회원가입 -->
  <insert id="insertMember">
      insert
        into member
        (
          user_no
        , user_id
        , user_pwd
        , user_name
        , email
        , gender
        , phone
        , address
        )
        values
        (
          seq_uno.nextval
        , #{userId}
        , #{userPwd}
        , #{userName}
        , #{email}
        , #{gender}
        , #{phone}
        , #{address}
        )
  </insert>
 
 

  <!-- 아이디중복체크(아이디 수 조회) -->
  <select id="selectUserIdCount" resultType="_int">
      select
             count(*)
        from member
       where user_id = #{checkId}      
  </select>
  <!-- 한 개의 컬럼, 한 개의 숫자만 조회된다. 자바에서의 int로 반환되게끔 한다. -->



  <!-- 회원정보수정 -->
  <update id="updateMember">
      update
             member
             
         set user_name = #{userName}
           , email = #{email}
           , phone = #{phone}
           , address = #{address}
           , gender = #{gender}
           , modify_date = sysdate
       where user_id = #{userId}        
  </update>
 
 

  <!-- 회원탈퇴 (행을 삭제하진 않고 개인정보만 일부 지운다. 이름 첫글자만 남기고 마스킹처리. -->
  <update id="deleteMember">
      update
             member
         set email = null
           , gender = null
           , phone = null
           , address = null
           , profile_url = null
<!--       , user_name = rpad( substr(user_name, 1, 1), 최종반환글자수, 덧붙일문자열 ) -->
           , user_name = rpad( substr(user_name, 1, 1), length(user_name), '*' )
           , status = 'N'
           , modify_date = sysdate
       where user_id = #{userId}
             
  </update>



</mapper>

 

- 마지막줄을 삭제했다.

- 암호화 전에는 아이디와 비번을 가지고 일치하는 회원을 조회하지만,

암호화 후에는 아이디만을 가지고 일치하는 회원을 조회한다.

- 존재하는 아이디만 잘 입력했다면 우선 조회는 된다.

조회할 때 비밀번호 컬럼(암호화된 비번)도 조회해서 멤버 객체에 담았다.

- 그러고나서 컨트롤러단에서 평문 비밀번호와 암호문 비밀번호를 비교할 수 있다.

우선 조회해가고, 자바단에서 비번 체크를 한다.

 

 

 

 

 

ㅁ MemberController

 

 

- 현재 컨트롤러의 로그인 성공 조건은 ~다. 조건을 하나 추가한다.

 

 

 

 

- matches 메소드 작성.

- 단순히 equals 비교가 아니다. bcrypt 객체 내에서 평문하고 암호문을 가지고 일치하는지 비교해준다.

true 혹은 false가 반환된다.

- 이러면 이제 로그인이 될것이다. 서버키고 로그인하면 로그인이 잘 된다.