[Spring] HashComponent

2024. 10. 9. 17:49Spring

웹사이트에서 회원들의 비밀번호를 안전하게 저장 및 관리하기 위해서 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