_-_-kk 2023. 5. 15. 18:49

 

// 전달 받은 비밀번호를 암호화하여
//DB에서 조회한 비밀번호와 비교 (DB에서 비교X)
//
sha 방식 암호화
//A 회원/비밀번호1234-> 암호화:
abcd
//B 회원/비밀번호1234->암호화:abcd(암호화시변경된내용이같음)
//
Bcrypt 암호화 : 암호화 하기전에 salt를 추가하여 변형된 상태로 암호화를 진행 //A 회원/비밀번호1234-> 암호화:abcd
//B 회원/비밀번호1234-> 암호화:@ddsd
// * 매번 암호화되는 비밀번호가 달라져서 DB에서 직접 비교 불가능
// 대신
Bcrypt 암호화를 지원하는 객체가
// 이를 비교하는 기능(메서드) 가지고있어서 이를 활용하면 된다

 

 

 

// 1번
//**
Bcrypt 암호화를 사용하기 위해 이를 지원하는 Spring- security 모듈 추가 **

// Spring Security Core // Spring Security Web // Spring Security Config

//이 3개를
//메이븐레파지토리사이트 에서 Spring-security 검색해서 각각 5.7.1 버전 소스
pom에 추가

 pom.xml ----------------------------------------------------------------------

<!-- Spring-security 모듈 추가 -->

<dependency>

    <groupId>org.springframework.security</groupId>

    <artifactId>spring-security-core</artifactId>

    <version>5.7.1</version>

</dependency>

 

<dependency>

    <groupId>org.springframework.security</groupId>

    <artifactId>spring-security-web</artifactId>

    <version>5.7.1</version>

</dependency>

 

<dependency>

    <groupId>org.springframework.security</groupId>

    <artifactId>spring-security-config</artifactId>

    <version>5.7.1</version>

</dependency>

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

 

// 2번
// 보안설정용
xml 생성
//
src/main/resources/에 있는 spring 폴더에 컨트롤 n해서 spring-security.xml 만들기

 

 

 

spring-security.xml---------------------------------------------------------------

 

 

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-5.7.xsd">

 

<!-- Bcrypt 암호화용 bean 생성 -->

<bean id="bcryptPasswordEncoder" 

class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

 

</beans>

 

 

 

 

 

 

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

 

// 3번

// spring-security.xml 를 읽으라는 코드를 //web.xml에 <param-value>에 //classpath:spring/spring-Security.xml 추가

//

 

 

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

classpath:spring/root-context.xml

classpath:spring/spring-security.xml

</param-value>

</context-param>

 

 

// 4번

MemberServiceImpl --------------------------------------------------

/암호화를 위한 Bcrypt 객채 의존성 주입 (DI) 추가
//디버거 5개 만들고( 기존 값이라도 암호화하면 암호화값이 매번 달라진다는것을 보기위해 디버거 많이 찍어 본거임 )
//서버 돌려서 확인해보기
//안되면 프로젝트 클린, 서버 클린, 메이븐 클린, 메이븐 업데이트 해보기 .
logger.debug(inputMember.getMemberPw() + "/" + Bcrypt.encode(inputMember.getMemberPw())); //logger.debug(inputMember.getMemberPw() + "/" + Bcrypt.encode(inputMember.getMemberPw())); //logger.debug(inputMember.getMemberPw() + "/" + Bcrypt.encode(inputMember.getMemberPw())); //logger.debug(inputMember.getMemberPw() + "/" + Bcrypt.encode(inputMember.getMemberPw()));
// 이렇게 찍으면 값이 다 다르니까 데이터베이스에 어떤거 하나 넣어놔도 비교를 못함. 그래서 이거를 따로 처리해야해서 서비스쪽으로 끌어와야함.
//그래서 우리가 입력받은 비밀번호와
db에서 조회한 비밀번호(암호화) matches라는 메소드로 비교해야함 //그럴려면 일단 로그인 하는 sql문 바꿔야함

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

 

 

 

// 5번

// member-mapper.xml -----------------------------------------------------------------
//패스워드 비교하는 구문인 AND MEMBER_PW = #{memberPw} 부분 삭제 혹은 주석 //MEMBER_PW 조회해야하니까
// TO_CHAR( ENROLL_DT, 'YYYY-MM-DD HH24:MI:SS') AS ENROLL_DT
// 이부분에는 MEMBER_PW 추가해서
// TO_CHAR( ENROLL_DT, 'YYYY-MM-DD HH24:MI:SS') AS ENROLL_DT, MEMBER_PW //이렇게 바꿔주기
//이렇게 바꾸면 비밀번호가 조회되어서
dao로 가지고 오겠고 그다음 service로 반환

 

 

 

 

 

  <select id="login"  parameterType="member"  resultMap="member_rm"  >

  SELECT MEMBER_NO, MEMBER_EMAIL, MEMBER_NICK ,MEMBER_TEL,

       MEMBER_ADDR, PROFILE_IMG, 

    TO_CHAR( ENROLL_DT, 'YYYY-MM-DD HH24:MI:SS') AS ENROLL_DT, MEMBER_PW

FROM MEMBER_S

WHERE MEMBER_EMAIL = #{memberEmail}

<!-- AND MEMBER_PW = #{memberPw} -->

AND SECESSION_FL = 'N' 

  </select>

 

 

 

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

// 6번
// loginMember == NULL 일치하는 이메일이 없다. (원래는 이메일과 비밀번호 비교했는데 이제는 비밀번호 를 비교하지 않으니까)
if(loginMember !=null) { //일치하는 이메일을 가진 회원 정보가 있을 경우
// 평문과 암호화된 비밀번호 비교
// matches메소드로 입력된 비밀번호 (평문) , 조회된 비밀번호 (암호화) 비교 => 같으면 true

if(Bcrypt.matches(inputMember.getMemberPw(), loginMember.getMemberPw() )) { //비밀번호가 일치할 경우

 

loginMember.setMemberPw(null); //
//원래는 로그인멤버 리턴해가지고 세션에 올라가는건데 비밀번호가 세션에 올라가면 안되니까 //비교 끝났으면 비밀번호 지우기. 세션에 못올라가게.
}else {//비밀번호가 일치하지 않을 경우 null
loginMember
= null;
}
}
return loginMember;

 

 

 

// 7번
//서버켜서 로그인 해보기
//당연히 실패 뜬다. 콘솔에 찍히는 암호화된 비밀번호를 디비버에서 업데이트 시켜줘야함

// 디비버에 추가

 

 

 

 

 

/ALTER TABLE MEMBER_S

//

//MODIFY MEMBER_PW VARCHAR2(100);

//

//

//

//UPDATE MEMBER_S SET

//

//MEMBER_PW ='콘솔에 찍힌 암호화된 비밀번호'

//

//WHERE MEMBER_NO = 2; //
//
//COMMIT;

 

 

 

 

 

 

 

 

1.
//이메일중복체크
//siginUp.jsp 에서

//유효성 검사 여부를 기록할 객체 생성 부분 에서 "sendEmail"

// 맴버컨트롤러.java 에서 emailDupCheck메서드 만들어줌

 

 

 

MemberController---------------------------------------------------

 

// 이메일 중복 검사

@ResponseBody  // ajax 응답 시 사용!

@GetMapping("/emailDupCheck")

public int emailDupCheck(String memberEmail) {

int result = service.emailDupCheck(memberEmail);

 

// 컨트롤러에서 반환되는 값은 forward 또는 redirect를 위한 경로인 경우가 일반적

// -> 반환되는 값은 경로로 인식됨

 

// -> 이를 해결하기위한 어노테이션 @ResponseBody 가 존재함

 

// @ResponseBody : 반환되는 값을 응답의 몸통(body)에 추가하여 

//   이전 요청 주소로 돌아감

// -> 컨트롤러에서 반환되는 값이 경로가 아닌  "값 자체"로 인식됨.

 

return result;

 

}

 

 

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

 

 

//맴버 서비스에도 메서드 만들기.

 MemberService ------------------------------------

 

/** 이메일 중복 검사 서비스

* @param memberEmail

* @return result

*/

public abstract int emailDupCheck(String memberEmail);

 

 

 

 

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

 

 

MemberServiceImpl ----------------------------------

 

 

// 3.

 


//멤버서비스인플 가면 맴버서비스인플 이름 부분에 빨간 경고줄 떠있을텐데
// 그거에 마우스 올리면 add 어쩌구 라고 맨위에 있는거 눌러주면 굳이 직접 안써도 Override 할거가 맨 밑에 자동으로 생성됨
// 중복여부검사라서 그냥 자바 하는것처럼 result를
dao 에서 받아오는구문 쓰면 됨.

 

 

// 이메일 중복 검사 서비스 구현

@Override

public int emailDupCheck(String memberEmail) {

return dao.emailDupCheck(memberEmail);

}

 

 

 

-

MemberServiceImpl -----------------------------