Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

KSI일기장

0426비밀번호 Bcrypt 암호화(Maven Repository 통한 라이브러리 사용) 본문

Spring

0426비밀번호 Bcrypt 암호화(Maven Repository 통한 라이브러리 사용)

MyDiaryYo 2023. 4. 26. 15:41

dependencies :Maven 프로젝트는 외부 저장소와 의존관계를 맺고 있어 프로젝트에 필요한

파일을(라이브러리) 사용자가 직접 받을 필요 없이 해당 태그내에 지정된 형식으로 작성하면

네트워크를 통해 외부 저장소에서 자동으로 얻어와 세팅한다

 

Maven Repository 홈페이지 접속해 필요한 라이브러리를 pom.xml <dependencies>안에 추가해준다

 

-pom.xml

 

 

 

 

-spring-security.xml 생성 후 암호화용 bean 생성 해준다

 

//MemberServiceImpl.java

package edu.kh.comm.member.model.service;
import org.mybatis.logging.LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import edu.kh.comm.member.model.dao.MemberDAO;
import edu.kh.comm.member.model.vo.Member;
import lombok.extern.slf4j.Slf4j;

//bean객체로 등록
@Service	//->비지니스 로직을 처리하는 클래스임을 명시 + bean으로 등록
@Slf4j
public class MemberServiceImpl implements MemberService {
//->에러 발생시 Add unimplemented method로 Member 오버라이딩

	@Autowired //DAO하고 연결
	private MemberDAO dao;

	@Autowired
	private BCryptPasswordEncoder bcrypt;
@Override
	public Member login(Member inputMember) {

		//전달 받은 비밀번호를 암호화 하여 DB에서 조회한 비밀번호화 비교(DB에서 비교X)

		//sha방식 암호화
		//A회원 비번 1234 -> 암호화: asdf
		//B회원 비번 1234 -> 암호화: asdf

		//Bcrypt방식 암호화
		//:암호화 하기전에 salt를 추가하여 변형된 상태로 암호화를 진행한다
		//A회원 비번 1234 -> 암호화: asdf
		//B회원 비번 1234 -> 암호화: qqggdsfe

		//매번 암호화되는 비밀번호가 달라져 DB에서 직접 비교 불가능
		//대신 Bcrypt 암호화를 지원하는 객체가
		//이를 비교하는 기능(메서드)를 가지고있어서 이를 활용하면 된다

		//***Bcrpyt 암호화를 사용하기 위해 이를 지원하는 Spring-security 모듈 추가해야한다***

		//			원래비밀번호	/	암호화된비밀번호
		log.debug(inputMember.getMemberPw() + " / " + bcrypt.encode(inputMember.getMemberPw()));
		log.debug(inputMember.getMemberPw() + " / " + bcrypt.encode(inputMember.getMemberPw()));
		log.debug(inputMember.getMemberPw() + " / " + bcrypt.encode(inputMember.getMemberPw()));

		Member loginMember = dao.login(inputMember);
		
		//loginMember == null ->일치하는 이메일이 없다는 의미
		if(loginMember != null) {	//일치하는 이메일을 가진 회원정보가 있을 경우

			//비밀번호암호화
								//평문(비밀번호)			DB에서 조회한 암호화된 비밀번호	->같으면 true
			if(bcrypt.matches(inputMember.getMemberPw(), loginMember.getMemberPw())) {	//비밀번호가 일치할 경우
				loginMember.setMemberPw(null);	//비교 끝나서 비밀번호 지우기 (session에 올라가지 않게끔)
			}else {
				loginMember = null;
			}
			
		}
		
		return loginMember;
	}