2024. 10. 9. 17:49ㆍSpring
웹사이트에서 회원들의 비밀번호를 안전하게 저장 및 관리하기 위해서 HashCompontent를 사용할 수 있다.
HashComponent
사용자의 password를 sha-512 해시 알고리즘이 적용된 상태로 바꿔주기 위한 컴포넌트
@Component
: Controller, Service, Repository 에 해당하지 않지만, 특정 내용에 대한 코드를 수행하기 위해 작동하는 스프링 빈
package com.itbank.component;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.springframework.stereotype.Component;
@Component
public class HashComponent {
// 문자열 input을 전달받아서 sha-512 해시 알고리즘이 적용된 output을 반환하는 함수
// 입력값이 같으면 출력값도 같다
// 비밀번호 일치여부를 확인할 수 있다
// DB에는 해시처리된 값이 저장되므로, DB 관리자도 패스워드를 확인할 수 없다
public String getHash(String input) {
MessageDigest md;
String output = null;
try {
md = MessageDigest.getInstance("SHA-512");
md.update(input.getBytes());
output = String.format("%0128x", new BigInteger(1, md.digest()));
} catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
return output;
}
}
MemberService
userpw에 HashComponent 적용
HashComponent 객체 생성
@Autowired를 이용하여, HashComponent와 연결할 객체를 생성해야 한다.
그럼 Hash를 적용해야 할 곳이 어디일까?
1. 회원가입 할 때 (add함수)
사용자가 입력한 userpw를 hash형태로 저장해 둔다.
사용자가 입력한 회원가입 정보를 MemberDTO 형태로 받아온다
-> public int add(MemberDTO dto) {
입력한 비밀번호를 getUserpw로 가져와서 hash 처리를 하고 변수에 저장해둔다
-> String hash = hashComponent.getHash(dto.getUserpw());
hash 변수를 setUserpw 를 이용하여 userpw 에 담는다
-> dto.setUserpw(hash);
dto를 MemberDAO에 있는 insert()함수를 이용하여 새로운 데이터를 생성한다 (== 회원가입)
-> return dao.insert(dto);
2. 로그인 할 때 (login함수)
애초에 hash형태로 비번을 저장했기 때문에,
로그인시에도 hash형태의 입력값과 userpw 를 비교한 뒤에
아이디와 비밀번호가 일치하면 로그인이 되도록 해야한다.
사용자가 입력한 패스워드로 해시값을 생성한다.
-> String hash = hashComponent.getHash(dto.getUserpw());
만들어진 해시값을 이용하여 DB에 저장된 해시값과 비교한다.
-> dto.setUserpw(hash);
return dao.login(dto);
import java.util.List;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.itbank.component.HashComponent;
import com.itbank.model.MemberDTO;
import com.itbank.repository.MemberDAO;
@Service
public class MemberService {
@Autowired private MemberDAO dao;
@Autowired private HashComponent hashComponent;
public List<MemberDTO> getMemberList() {
List<MemberDTO> list = dao.selectList();
list.forEach(dto -> dto.setUserpw("********"));
return list;
}
public MemberDTO getMember(int idx) {
return dao.selectOne(idx);
}
public int add(MemberDTO dto) {
String hash = hashComponent.getHash(dto.getUserpw());
dto.setUserpw(hash);
return dao.insert(dto);
}
public MemberDTO login(MemberDTO dto) {
String hash = hashComponent.getHash(dto.getUserpw());
dto.setUserpw(hash);
return dao.login(dto);
}
public int delete(int idx) {
return dao.delete(idx);
}
public int modify(MemberDTO dto) {
String hash = hashComponent.getHash(dto.getUserpw());
dto.setUserpw(hash);
int row = dao.update(dto);
return row;
}
public String resetPass(MemberDTO dto) {
String newPassword = UUID.randomUUID().toString().replace("-", "").substring(0, 8);
String hash = hashComponent.getHash(newPassword);
System.out.println("newPassword : " + newPassword);
System.out.println("hash : " + hash);
dto.setUserpw(hash);
int row = dao.updatePassword(dto);
return row != 0 ? newPassword : null;
}
}
회원가입 할 때 hash형태로 저장해놓고, 로그인 할때에는 그 값을 원래 값으로 바꿔놓지 않고 비교를 하여
계속 로그인이 되지 않았었다.
왜 그런 결과값이 나오는지 항상 생각을 하며 코드를 짜는게 중요한 것 같다.
'Spring' 카테고리의 다른 글
[Spring] annotaion (1) | 2024.10.09 |
---|---|
[Spring] Interceptor (1) | 2024.10.09 |
[Spring] mybatis mapper (4) | 2024.10.09 |
[Spring] 스프링 시작하기 (1) | 2024.10.09 |
[Spring] Spring이 뭘까? (3) | 2024.10.09 |