[ Spring boot / JAVA ] 쇼핑몰을 만들어보자 (1) - Spring Security
안녕하세요 ! 😊 [ Spring boot / JAVA ] 스프링 부트 - Controller(2) 회원가입 기능 구현 안녕하세요 ! (●'◡'●) [ Spring boot / JAVA ] 스프링 부트 - Controller(1) 안녕하세요 ! (. ❛ ᴗ ❛.) 이번 글에서는 스프
preparingforme-n-us.tistory.com
안녕하세요 !
지난 글에서는 회원가입을 할 때 비밀번호를 암호화하지 않고 저장했습니다.
사용자가 입력한 값을 그대로 DB에 저장해두는 것보다 암호화를 한 뒤 저장해주는 것이 안전하기 때문에
Spring Security에서 제공하는 BCryptPasswordEncoder를 사용해서 비밀번호를 암호화해서 저장해보겠습니다 !
BCrytPasswordEncoder 란?
- Spring Security에서 제공하는 비밀번호를 암호화 하는 데 사용하는 메소드를 가진 클래스입니다.
- BCrypt Hashing을 사용하여 암호화합니다.
Bcrypt Hashing이 뭔지 간단하게 짚어보고 넘어가자면,
인간이 해독할 수 없는 문자열( Hashed Text )로 바꿔주는 단방향 암호화입니다.
※ 단방향 암호화는 평문을 암화화할 수는 있지만 암호화된 문자는 복호화할 수 없습니다.
※ 양방향 암호화는 복호화가 가능합니다.
BCryptPasswordEncoder.java 에서 제공하고 있는 encode(), matches()를 사용해볼건데 그 전에 메소드를 한번 살펴볼까요?
@Override
public String encode(CharSequence rawPassword) {
if (rawPassword == null) {
throw new IllegalArgumentException("rawPassword cannot be null");
}
String salt = getSalt();
return BCrypt.hashpw(rawPassword.toString(), salt);
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
if (rawPassword == null) {
throw new IllegalArgumentException("rawPassword cannot be null");
}
if (encodedPassword == null || encodedPassword.length() == 0) {
this.logger.warn("Empty encoded password");
return false;
}
if (!this.BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
this.logger.warn("Encoded password does not look like BCrypt");
return false;
}
return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
}
encode에서는 입력받은 비밀번호를 BCrypt의 hashpw를 통해 hased text로 변환해주고 있는 것을 확인할 수 있습니다.
matches를 보면 입력받은 평문이 저장된 encode되어있는 비밀번호화 비교해서 판단하고있습니다.
그럼 이제 encoder를 사용해볼까요?
config 폴더 안에 EncoderConfig.java 를 만들어주겠습니다.
@Configuration
public class EncoderConfig {
@Bean
public BCryptPasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
}
BCryptPasswordEncoder의 encode(), matches() 메소드를 사용해서 signup과 login로직을 조금 수정할것입니다.
MemberService.java
@Service
@RequiredArgsConstructor
public class MemberService {
@Autowired
private MemberRepository memberRepository;
private final BCryptPasswordEncoder encoder;
public boolean signup(MemberDto memberDto) {
MemberEntity mem = memberDto.toEntity();
try{
// save()가 성공하면 true 반환.
memberRepository.save(mem);
return true;
}catch (Exception e){
return false;
}
}
public boolean login(MemberDto memberDto, HttpSession session) {
MemberEntity mem = memberDto.toEntity();
try{
// login이 성공하면 true 반환.
MemberEntity loginMem = memberRepository.findByMemberId(mem.getMemberId());
if(encoder.matches(mem.getPassword(), loginMem.getPassword())){
session.setAttribute("member", loginMem);
return true;
}else{
return false;
}
}catch (Exception e){
return false;
}
}
}
회원가입할 때 사용자로부터 입력받은 password를 encoder.encode() 로 암호화 하여 저장하고
로그인할 때 이미 저장되어있던 password와 입력한 password를 encoder.matches()를 이용해서 비교하고 일치하면 true를 반환합니다.
회원가입 폼에서 비밀번호에 member 라고 적어서 제출해보겠습니다.
이제 회원가입 버튼을 누르고 MySQL에 들어간 내용을 확인해보면
이렇게 암호화가 되어 저장된것을 확인할 수 있습니다 !
로그인도 잘되는지 확인해볼까요?
서버에서 로그인 요청을 성공적으로 처리한 것을 확인할 수 있습니다 !
이렇게 이번 글에서는 비밀번호를 암호화해서 저장하고
암호화된 비밀번호와 비교해서 로그인하는 것까지 구현해봤습니다.
감사합니다.
'JAVA > Spring Boot' 카테고리의 다른 글
[ Spring boot / JAVA ] Lombok - Getter, Setter, Builder ... 적용 안됨 해결 (1) | 2024.03.03 |
---|---|
[ Spring boot / JAVA ] 쇼핑몰을 만들어보자 (1) - Spring Security (0) | 2024.03.02 |
[ Spring boot / JAVA ] 회원가입 기능 구현 - MVC (0) | 2024.03.01 |
[ Spring boot / JAVA ] api요청하기 - Controller (0) | 2024.03.01 |
[ Spring boot / JAVA ] 스프링 부트를 시작해보자 (1) | 2023.11.02 |