YJ의 새벽

Spring 6 ( Bcrypt 암호화 ) 본문

Spring/Spring

Spring 6 ( Bcrypt 암호화 )

YJDawn 2023. 4. 26. 16:27

 

 

 

 

--- 암호화가 되지 않은 PW 를 '평문상태' 라고 한다 .

 

 

 

 

 

 

 

-- spring-security 모듈을 pom.xml 에 추가해주자 .

-- Core , Web , Config   version  5.7.1  사용 . 

 

https://mvnrepository.com/search?q=spring-security 

-- Core , Web , Config   version  5.7.1  사용 . 

 

--- 복사해서 !! pom.xml 에 붙여넣기

 

		<!-- spring-security 모듈 추가  -->
		<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
		<dependency>
		    <groupId>org.springframework.security</groupId>
		    <artifactId>spring-security-core</artifactId>
		    <version>5.7.1</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.7.1</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.7.1</version>
		</dependency>

 

 

 

 

 

--- pom.xml 에 붙여넣었으면 . 

--- resources/spring 폴더안에 . SpringBeanConfiguration File 을 만들자 .

--- security 체크 하고 마무리 .

 

 

 

 

 

-- 이후 만든 spring-security.xml  에 암호화할수있는 Bean 을 만들어주자 .

--  id =  "변수"   ,   class = "경로"  

	<!-- Bcrypt 암호화용 bean 생성 -->
	<bean id="bcryptPasswordEncoder" 
	     class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

 

-- web.xml 에서 .  root-context 와 같이 읽을수 있도록  spring-security.xml 도 넣어준다.

 

 

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

-sha 방식 암호화 :

  A회원 / 비밀번호 1234  --> 암호화 : abcd

  B회원 / 비밀번호 1234  --> 암호화 : abcd

-Bcrypt 암호화 암호화 하기 전에 salt 를 추가하여 변형된 상태로 암호화를 진행

  A회원 / 비밀번호 1234  --> 암호화 : abcd

  A회원 / 비밀번호 1234  --> 암호화 : !sd2

     -- 매번 암호화되는 비밀번호가 달라져서 직접 비교 불가능 .

      - 대신 Bcrypt 암호화를 지원하는객체가 이를 비교하는기능(메서드) 를 가지고있어서 이를 활용 .

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

 

@Slf4j
@Service  // 비즈니스 로직을 처리하는 클래스임을 명시 + bean으로 등록
public class MemberServiceImpl implements MemberService{

	@Autowired
	private MemberDAO dao;
	
	@Autowired   // 암호화를 위한 bcrypt 객체 의존성 주입 (DI)
	private BCryptPasswordEncoder bcrypt;
	
	// 로그인 서비스 구현
	@Override
	public Member login(Member inputMember) {
		
		log.debug( inputMember.getMemberPw() + " / " + bcrypt.encode( inputMember.getMemberPw()));
		log.debug( inputMember.getMemberPw() + " / " + bcrypt.encode( inputMember.getMemberPw()));
		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);
		
		return loginMember;
	}
}

--- log 에서 값이 다 다른것을 확인할수 있다 . 

 

 

 

 

-- Service 에서 PW 를 비교하기위해 , MEMBER_PW 도 조회해주자.

 

-- MemberServiceImpl .  service 클래스 가서 , 암호화 . 

	// 로그인 서비스 구현
	@Override
	public Member login(Member inputMember) {
		
		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;
	}

 

 

-- 처음 찍힌 암호를 DB 에 업데이트 해놓고.

-- 다시 로그인하면 , bcrypt.matches 가 비교후 로그인 성공 ! 

 

 

 

 

 

 

 

 

 

 

Comments