SPRING
// 전달 받은 비밀번호를 암호화하여
//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 -----------------------------