[ Java ] 내장객체로 비.암(비밀번호 암호화 하기)

2024. 6. 25. 19:33· LANGUAGE/└ Java

환경 : Spring Tool Suite 4, DBeaver

 

 

 먼저, 암호화 연습을 위한 테이블 생성하겠다

create table secret_member(
member_id varchar2(20) primary key,
member_pw char(60) not null, /*비밀번호 값은 고정!!!!!*/
member_nick varchar2(30) not null unique
);

    (+) 비밀번호는 Bcrypt 사용 시 60바이트로 고정!

 

 

   encoder를 생성해 두고 가져다 쓰기위한 SecretConfiguration 파일을 생성한다 

 

   - SecretConfiguration.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Configuration
public class SecretConfiguration {

	@Bean
	public BCryptPasswordEncoder encoder() {
		return new BCryptPasswordEncoder();
	}
}

 

 

 

DB와 연동을 위한 클래스 파일을 생성한다.

 

   - SecretMemberDto.java

package com.kh.spring16.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data @Builder @NoArgsConstructor @AllArgsConstructor
public class SecretMemberDto {
	private String memberId;
	private String memberPw;
	private String memberNick;
}

   (+) Builder로 한 번에 데이터를 삽입할 수 있도록 도와줌!!!!!

 

 

코드와 데이터베이스를 연동해주기 위해 xml 생성한다

 

 

    - secretMember-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
<mapper namespace="secretMember">
	
	<insert id="join">
		insert into secret_member(member_id, member_pw, member_nick)
		values(#{memberId}, #{memberPw}, #{memberNick})
	</insert>
	
</mapper>

     (+)DB에 데이터 삽입할 수 있는 용도

 

 

   - SecretMemberDao.java

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Repository;

import com.kh.spring16.dto.SecretMemberDto;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Repository
public class SecretMemberDao {
	
	@Autowired
	private SqlSession sqlSession;
	
	@Autowired
	private BCryptPasswordEncoder encoder;
	
	public void insert(SecretMemberDto secretMemberDto) {
		//비밀번호를 암호화하여 재설정하는 코드
		String origin = secretMemberDto.getMemberPw();//비밀번호 추출
		String result = encoder.encode(origin);//암호화
		secretMemberDto.setMemberPw(result);//비밀번호 재설정
		
		sqlSession.insert("secretMember.join", secretMemberDto);
	}
}

   (+) 사용자가 입력한 비번을 bcrypt로 암호화하여 저장해줌~~

 

 

이제 테스트 해보자!


[ 회원가입 테스트 ] 

   - SecretMemberTest01.java

@Slf4j
@SpringBootTest
public class SecretMemberTest01 {
	
	@Autowired
	private SecretMemberDao secretMemberDao;

	@Test
	public void test() {
		//회원가입 테스트
		//SecretMemberDto memberDto = new SecretMemberDto();
		//memberDto.setMemberId("testuser1");
		//memberDto.setMemberPw("Testuser1!");
		//memberDto.setMemberNick("테스트유저1");
		
		SecretMemberDto secretMemberDto = SecretMemberDto.builder()
				.memberId("testuser1")
				.memberPw("Testuser1!")
				.memberNick("테스트유저1")
				.build();
		
		//DAO를 이용한 가입처리
		secretMemberDao.insert(secretMemberDto);
	}
	
}

   (+) 주석처럼 각각 필드마다 값을 삽입할 수 있지만, 한 번에 삽입할 수 있는 코드가 있다. (DTO에 적용한 어노테이션 덕분!!)

 

테스트 실행 후 DB 확인

 

암호화 돼서 들어간 것을 확인할 수 있다!! good


[ 로그인 테스트 ] 

 

DB에서 로그인한 회원의 정보를 찾기 위해 매퍼에 아이디로 정보 찾는 코드 추가 및 DAO 코드 추가

 

    - secretMember-mapper.xml (id="find" 부분)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
<mapper namespace="secretMember">
	
	<insert id="join">
		insert into secret_member(member_id, member_pw, member_nick)
		values(#{memberId}, #{memberPw}, #{memberNick})
	</insert>
	
	<select id="find" resultType="SecretMemberDto">
		select * from secret_member where member_id = #{memberId}
	</select>
	
</mapper>

 

 

   - SecretMemberDao.java (로그인 정보 비교 코드 추가)

 

@Slf4j
@Repository
public class SecretMemberDao {
	
	@Autowired
	private SqlSession sqlSession;
	
	@Autowired
	private BCryptPasswordEncoder encoder;
	
	public SecretMemberDto selectOne(String memberId) {
		return sqlSession.selectOne("secretMember.find", memberId);
	}
	
	public SecretMemberDto selectOneByMemberPw(
							SecretMemberDto secretMemberDto) {
		//사용자가 입력한 아이디로 DB에서 정보를 조회
		SecretMemberDto findDto = sqlSession.selectOne(
					"secretMember.find", secretMemberDto.getMemberId());
		//조회 결과가 없다면 아이디가 없는 것이므로 중단
		if(findDto == null) return null;
		
		//비밀번호를 "암호화" 고려하여 비교
		boolean isValid = encoder.matches(
				secretMemberDto.getMemberPw(), findDto.getMemberPw());
		//isValid 결과에 따라 반환
		return isValid ? findDto : null;
	}
}

 

 

로그인 테스트 진행!!

 

   - SecretMemberTest02.java

@Slf4j
@SpringBootTest
public class SecretMemberTest02 {
	
	@Autowired
	private SecretMemberDao secretMemberDao;

	@Test
	public void test() {		
		//로그인 테스트
		SecretMemberDto secretMemberDto = SecretMemberDto.builder()
				.memberId("testuser1")
				.memberPw("Testuser1!df")
				.build();
		
		//로그인 판정
		SecretMemberDto findDto = 
				secretMemberDao.selectOneByMemberPw(secretMemberDto);
		
		log.debug("findDto = {}", findDto);
	}
	
}

 

 로그에 찍힌 결과를 확인 해보면,

맞게 작성한 경우 DTO 정보가 들어있고, 틀린 경우 null 값이 들어옴을 알 수 있다.

 

 

맞게 작성한 경우
틀리게 작성한 경우

 

 

 

개인 공부 기록용입니다:)

728x90