BankApp - 암호화 처리

Gun·2023년 9월 22일

Spring Boot - BankApp

목록 보기
22/25
💡 학습목표
   1. security 에서 제공하는 암호화 클래스 사용 
   2. 회원가입 시 회원 비밀번호 암호화 처리
   3. 로그인 서비스 처리
// 암호화 
implementation 'org.springframework.security:spring-security-crypto'

해시 함수란
해시 함수(Hash Function)는 임의의 길이를 가진 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다. 이러한 과정을 해싱이라 하며, 해시 함수의 결과값을 해시 값, 해시 코드, 해시 체크섬 또는 간단히 해시라고 부릅니다.

MD5, SHA-1, SHA-256 등은 대표적인 해시 함수입니다. 각각은 다양한 용도로 사용되며, 보안 수준에 따라 적절한 해시 함수를 선택할 수 있습니다.


package com.tencoding.bank.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Component // IoC 대상 - 2개 이상의 빈을 등록해야 할 때 사용
public class WebMvcConfig implements WebMvcConfigurer{
	
	// DI 처리(의존성 주입)
	@Autowired
	private AuthInterceptor authInterceptor;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(authInterceptor)
		.addPathPatterns("/account/**");
	}
	
	@Bean // IoC 관리 대상 -> 싱글톤
	public PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}
	
}
💡 스키마 - 기존 varchar(30) -> varchar(100)
alter table user_tb
modify column password varchar(100) not null;

회원가입, 로그인 로직 변경


package com.tencoding.bank.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.tencoding.bank.dto.SignInFormDto;
import com.tencoding.bank.dto.SignUpFormDto;
import com.tencoding.bank.handler.exception.CustomRestfulException;
import com.tencoding.bank.repository.interfaces.UserRepository;
import com.tencoding.bank.repository.model.User;

@Service // IoC 대상 - 싱글톤 패턴
public class UserService{

	// DAO - 데이터 베이스 연동
	@Autowired
	private UserRepository userRepository;
	
	@Autowired
	private PasswordEncoder passwordEncoder;

	/**
	 * 회원가입
	 * 비밀번호 암호화 처리
	 * @param signUpFormDto
	 */
	@Transactional
	public void signUp(SignUpFormDto signUpFormDto) {
		
		String rawPwd = signUpFormDto.getPassword();
		String hashPwd = passwordEncoder.encode(rawPwd);
//		System.out.println("rawPwd :"+rawPwd);
//		System.out.println("hashPwd : "+hashPwd);
		signUpFormDto.setPassword(hashPwd);
		
		int result = userRepository.insert(signUpFormDto);
		System.out.println("result : " + result);
		if(result != 1) {
			throw new CustomRestfulException("회원가입 실패", HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}

	// 로그인 서비스 처리
	public User signIn(SignInFormDto signInFormDto) {
		
		// User userEntity = userRepository.findByUsernameAndPassword(signInFormDto);
		// findByUserNameAndPassword <-- where -> id and pw
		
		// 계정 이름만 확인
		User userEntity = userRepository.findByUsername(signInFormDto.getUsername()); 
		
		// 계정 확인
		// 계정이 존재하지 않습니다.
		if(userEntity == null ||
				userEntity.getUsername().equals(signInFormDto.getUsername()) == false) {
			throw new CustomRestfulException("존재하지 않는 계정입니다.", HttpStatus.INTERNAL_SERVER_ERROR);
		}
		// 비번 확인
		// 비밀번호가 틀렸습니다.
		boolean isPwdMatched = passwordEncoder.matches(signInFormDto.getPassword(), userEntity.getPassword());
		
		if(isPwdMatched == false) {
			throw new CustomRestfulException("비밀번호가 일치하지 않습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
		}
				
		return userEntity;
	}
}

user.xml

	<select id="findByUsername" resultType="com.tencoding.bank.repository.model.User">
 		select * from user_tb where username = #{username}
 	</select>

0개의 댓글