해커톤을 진행하면서 로그인과 회원가입을 구현했는데 회원가입을 할때 비밀번호를 암호화하지 않고 데이터베이스에 저장을 하면 보안상 문제가 생길수있다.
암호화를해서 저장을 하더라도 복호화가 가능하다면 암호화된 데이터를 탈취당해도 보안상 문제가 생길수 있다.
그래서 단방향 암호화 방법인 해시를 사용하려고한다.
Spring Security 사용하기 (의존성 추가)
implementation 'org.springframework.boot:spring-boot-starter-security
dependencies에 해당 코드를 추가해주자.
비밀번호 암호화 하기 (회원가입)
@Configuration
public class WebSecurityConfig {
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
}
BcryptPasswordEncoder를 빈으로 등록해준다.
@Override
public void saveMember(MemberInputDto userInputDto) {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setMemberEmail(userInputDto.getMemberEmail());
memberEntity.setPassword(bCryptPasswordEncoder.encode(userInputDto.getPassword()));
memberEntity.setNickname(userInputDto.getNickname());
memberRepository.save(memberEntity);
}
BcryptPasswordEncoder의 encode를 이용해서 input으로 받은 비밀번호를 암호화 하여 entity에 넣고 암호화된 비밀번호를 저장한다.
다음과 같이 암호화된 비밀번호값이 저장된다.
비밀번호 비교하기 (로그인)
처음 비밀번호를 비교할때 로그인을 시도할때 받은 비밀번호를 encode를 하고
데이터베이스에 저장된 암호화된 비밀번호와 비교를 하는 방법으로 구현을 했는데 로그인이 되지 않는 문제가 발생했다.
이유를 찾아보니 해시함수로 암호화를 할때 salt라고 매번 달라지는 값이 존재 하기 때문이였다.
그래서 다른 방법을 찾아보니 BcryptPasswordEncoder의 matches를 사용하여 해결할수 있었다.
MemberEntity memberEntity = memberRepository.findByMemberEmail(memberEmail)
.filter(m->bCryptPasswordEncoder.matches(password,m.getPassword()))
.orElse(null);
위 코드처럼 memberEmail과 password를 받고 memberEmail이 있는지 확인한뒤, 존재한다면 BcryptPasswordEncoder의 matches를 통해 입력받은 password와 memberEmail를 통해 데이터베이스의 password를 찾아와 비교를 한다.
(matches 함수를 사용할때 앞에 input으로 받은 plain 값을 먼저 써주자)
'Java , Spring > Spring' 카테고리의 다른 글
[Spring] 인증, 인가 - (쿠키, 세션, 토큰) (1) | 2024.02.08 |
---|---|
[Spring] 선언적 트랜잭션 @Transactional (1) | 2024.01.22 |
[Spring] 필터(Filter)와 인터셉터(Interceptor) (0) | 2023.09.12 |
[Spring] @PathVariable, @RequestParam, @ModelAttribute, @RequestBody (0) | 2023.08.21 |
[Spring] @Controller 와 @RestController (0) | 2023.08.07 |
댓글