만들어진 프로젝트에 스프링 시큐리티의 암호화를 적용하기로 함
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. 부트스트랩을 이용해 화면 수정
'organize > 프로젝트' 카테고리의 다른 글
1차 프로젝트 추가 - 암호화2 (0) | 2024.12.23 |
---|---|
컬렉션 프레임워크(1) Map (0) | 2024.12.03 |
justBoard15 댓글 구현(6) 完 (0) | 2024.11.11 |
justBoard15 댓글 구현(5) 댓글 페이지 처리 (0) | 2024.10.20 |
justBoard14 댓글 구현(4) (0) | 2024.10.15 |