YJ의 새벽
Spring 6 ( Bcrypt 암호화 ) 본문
--- 암호화가 되지 않은 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 가 비교후 로그인 성공 !
'Spring > Spring' 카테고리의 다른 글
Spring 8 ( 회원가입 ) (0) | 2023.04.26 |
---|---|
Spring 7 ( email , 닉네임 중복체크 ) (0) | 2023.04.26 |
Spring 5 ( 로그인 , 로그아웃 , 쿠키 ) (0) | 2023.04.25 |
Spring 4 ( DB 접근 +MyBatis 환경설정 ) (0) | 2023.04.24 |
Spring 3 ( 파라미터 가져오기 , 화면전환 ) (0) | 2023.04.21 |