티스토리 뷰
지금 회원 테이블 저장방식은 사용자의 입력을 그대로 받아 저장하는 방식이다.
사용자가 비밀번호로 "1234" 를 입력하면 테이블에도 그대로 1234를 저장한다.
이런 지극히 단순한 방식은 딱 보기에도 보안에 굉장히 취약하고 끔찍하기 그지없는 방식이다.
지금부터 비밀번호를 암호화해서 저장하는 방식으로 고쳐 볼 것이다.
구글에 비밀번호 암호화를 쳐보면 대부분이 Spring Security를 사용해서 암호화를 한다.
그러나 나는 Spring Security에 대한 이해가 부족하다....
마냥 따라하면 되긴 하겠지만 썩 끌리지 않는다. 나중에 Security의 기본적인 이해를 하고 적용해 보도록 하고
지금은 다른방식으로 암호화를 해보자.
gradle에 추가
jbcrypt 라이브러리를 사용한다.
implementation group: 'org.mindrot', name: 'jbcrypt', version: '0.3m'
Bcrypt 해시 함수를 사용하여 비밀번호 암호화해보자.
BCrypt
BCrypt는 단순히 입력을 1회 해시하는 것이 아니라, 랜덤의 salt를 부여하여 여러번 해시를 적용하여 원래의 암호를 추측하기 어렵게 한다.
즉, 똑같은 비밀번호로 회원가입을 해도 테이블에 들어간 값은 다르다는 것이다.
해시 함수 사용하여 만들어낼 수 있는 값들을 왕창 저장해 해킹하는 레인보우테이블을 salt의 추가로 방지할 수 있다.
RegisterService에 추가
@Service
@RequiredArgsConstructor
public class RegisterService {
private final MemberRepository memberRepository;
public boolean validUserForm(String userName, String password1, String password2) {
Optional<Member> findUser = memberRepository.findByUsername(userName);
return password1.equals(password2) && findUser.isEmpty();
}
/**
* Bcrypt 비밀번호 암호화
*/
public String regBcrypt(String password){
return BCrypt.hashpw(password, BCrypt.gensalt());
}
}
비밀번호를 넣으면 해쉬값을 리턴해준다.
LoginService에 password일치 여부 확인 추가
@Service
@RequiredArgsConstructor
public class LoginService {
private final MemberRepository memberRepository;
public Member loginBcrypt(String username, String password){
//유저를 찾아서
Optional<Member> findMember = memberRepository.findByUsername(username);
//찾은 유저가 가진 DB안의 비밀번호와 입력값을 비교하고 다르면 null을 반환
return findMember.filter(m -> BCrypt.checkpw(password, m.getPassword())).orElse(null);
}
}
해쉬함수로 인코딩된 값은 복호화가 불가능하다.
비밀번호 원본과 테이블에 들어간 해쉬값의 일치를 확인하려면 BCrypt.checkpw(비밀번호, 테이블 값)
사용하면 된다.
Controller
@PostMapping("/login")
public CreateMemberResponse login(@RequestBody @Valid CreateMemberRequest request){
//loginService 주입
Member loginMember = loginservice.loginBcrypt(request.getName(), request.getPassword());
if(loginMember == null){
throw new IllegalArgumentException("사용자 정보가 일치하지 않음.");
}else {
return new CreateMemberResponse(loginMember.getId());
}
}
유저가 로그인을 시도하면 LoginService를 통해 DB에 있는 회원인지 아닌지 확인하여 반환한다.
결과를 확인해보자
전부 똑같은 비밀번호로 회원가입을 했는데 각기 다른 값이 해쉬값으로 저장되었다.
'Spring > 게시판API서버' 카테고리의 다른 글
[Spring] 게시판 API (6-2) JWT 적용 (0) | 2023.03.13 |
---|---|
[Spring] 게시판 API (6-1) Spring Security 적용하기 (0) | 2023.03.13 |
[Spring] 게시판 API (4) 생성일, 수정일 추가 (0) | 2023.03.07 |
[Spring] 게시판 API (3) Controller (0) | 2023.03.07 |
[Spring] 게시판 API (2) Repository (0) | 2023.03.07 |
- Total
- Today
- Yesterday
- Security
- Vmmem종료
- 웹소켓 채팅
- 게시판 채팅
- bcrypt
- 푸시알림동작원리
- Spring Stomp
- Stomp Kafka
- Spring 대댓글
- Bcypt
- FCM
- Spring WebSocket
- Stomp RabbitMQ
- Spring
- Authentication
- Spring 채팅
- springboot
- spring orphan
- Spring RabbitMQ
- ChattingApp
- authorization
- MessageBroker
- 로컬캐시
- loadbalancing
- Flutter
- Cache
- Kubernetes
- nativeQuery
- Vmmem
- ERD설계
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |