organize/프로젝트

1차 프로젝트 추가 - 암호화1

001cloudid 2024. 12. 22. 17:01
728x90

만들어진 프로젝트에 스프링 시큐리티의 암호화를 적용하기로 함

 

 

1. 라이브러리 추가

기존 프로젝트 스프링 프레임워크의 버전은 4.3.8이었으나 Spring Security를 이용할때 4.x 버전에 버그가 있다고 하여,

스프링 프레임워크의 버전을 5.0.7로 변경한 후 Maven Dependencies에 추가할 라이브러리를 pom.xml에 작성해주는 것으로부터 시작

 

pom.xml

(...생략...)

	<properties>
		<java-version>11</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version> <!-- 스프링 시큐리티 4.버전에서 버그가 있음 -->
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>

		<!-- Spring Security 적용 추가 -->
		<!-- Spring Security Core (암호화 관련 기능 제공) -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-core</artifactId>
			<version>${org.springframework-version}</version> 
		</dependency>

		<!-- Spring Security Crypto (암호화 관련 기능 제공) -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-crypto</artifactId>
			<version>${org.springframework-version}</version> 
		</dependency>
		<!-- Spring Security 적용 끝 -->
        
(...생략...)

BCryptPasswordEncoder를 사용할 수 있도록 설정을 추가 방법

1. root-context.xml과 servlet-context.xml 파일을 통해 필요한 설정

2. Java Config 기반의 설정

둘 중 하나로 해야함

 

web.xml에 대한 추가 설정은 따로 하지 않음. 실제 암호화 설정은 Spring 설정 파일(root-context.xml 또는 servlet-context.xml에서 다룸)

 

2. root-context.xml

root-context.xml에서 PasswordEncoder를 빈으로 등록하고 필요한 서비스 클래스에서 이를 사용할 수 있도록 주입받을 수 있음

 

root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- BCryptPasswordEncoder 빈 등록 -->
	<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

	(...이하 생략...)
    
</beans>

 

3. MemberService.java

PasswordEncoder를 주입하는 곳은 비즈니스 로직을 담당하는 서비스 클래스에 주입받음. 

즉, MemberService에 주입받을 수 있도록해야함

MemberService.java

package com.itwillbs.service;

(...생략...)

@Service
public class MemberService {

	@Inject
	private MemberDAO memberDAO;
	
	private final PasswordEncoder passwordEncoder;
	
	@Autowired
	public MemberService(PasswordEncoder passwordEncoder) {
		this.passwordEncoder = passwordEncoder;
	}

(...생략...)

	// ============회원 가입
	public void insertMember(MemberDTO memberDTO) {
		System.out.println("MemberService insertMember()");
		
		// 1. 평문 비밀번호를 암호화
		String encodedPassword = passwordEncoder.encode(memberDTO.getPw());
		
		// 2. 암호화된 비밀번호를 memberDTO로 저장
		memberDTO.setPw(encodedPassword);
		
		// 3. 암호화된 비밀번호와 함께 회원 데이터를 DAO로 전달
		memberDAO.insertMember(memberDTO);
	}

(...생략...)

}

이후 회원 가입

바로 오류가 발생됨. 오류가 발생된 이유는 암호화해서 DB에 값을 넣을 때 데이터크기가 맞지 않아서 생기는 문제.

비밀번호는 20자인데 암호화된 것은 20자를 넘어간다는 이야기인듯.

따라서 컬럼 타입의 크기를 수정할 필요가 있음

 

정확히 어느정도의 크기인지 몰라서 100으로 변경

 

다시 회원가입

암호화는 성공적으로 된 것을 알 수 있음

회원가입 시 했던 비밀번호를 입력하고 로그인을 시도

암호화된 비밀번호를 입력 시

로그인이 성공한다. 평문 암호를 입력했을 때 로그인이 될 수 있게 구현해야하는데, 뭔가 잘못되었다...

 

또 다른 테스트를 위해서 다른 아이디 를 만들어보았다

BCrypt로 암호화된 비밀번호는 60자로 현재 varchar(100)을 해놨는데 이는 불필요한 자원을 사용할 수 있으므로 수정이 필요한 것 같다.

 

남은 부분

1. 암호화 완료

2. 부트스트랩을 이용해 화면 수정

728x90