Spring Security와 BCrypt를 이용한 비밀번호 암호화 완벽 가이드
안녕하세요! 개발자 여러분 👋
오늘은 Spring Security와 BCrypt를 사용하여 비밀번호를 안전하게 암호화하는 방법에 대해 단계별로 알아보겠습니다. 회원가입부터 로그인까지, 보안을 강화하는 실용적인 예제를 준비했어요!
1단계: pom.xml에 Spring Security 의존성 추가
아래와 같이 pom.xml에 Spring Security 관련 의존성을 추가해 주세요.
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.3.13.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.3.13.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.3.13.RELEASE</version>
</dependency>
TIP: 안정성과 보안을 위해 항상 최신 버전을 사용하는 것이 좋습니다.
2단계: 암호화 설정 파일 구성
2.1 security-context.xml 생성
BCryptPasswordEncoder를 Bean으로 등록해 전역에서 사용할 수 있도록 설정합니다.
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
2.2 web.xml 설정
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml
/WEB-INF/spring/appServlet/security-context.xml
</param-value>
</init-param>
3단계: 회원가입 시 비밀번호 암호화
컨트롤러에서 @Autowired로 BCryptPasswordEncoder를 주입하고, 평문 비밀번호를 암호화하여 저장합니다.
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@RequestMapping("/registDo")
public String registDo(HttpServletRequest request) {
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String name = request.getParameter("name");
String encodedPw = passwordEncoder.encode(pw);
System.out.println("암호화된 비밀번호: " + encodedPw);
MemberVO member = new MemberVO(id, encodedPw, name);
try {
memberService.registMember(member);
} catch (Exception e) {
e.printStackTrace();
return "errorView";
}
return "redirect:/";
}
주의: BCrypt는 단방향 암호화이므로 복호화가 불가능합니다. 반드시 DB에는 암호화된 값만 저장하세요.
4단계: 로그인 시 비밀번호 비교
BCrypt는 항상 다른 해시 결과를 생성하므로, equals()가 아닌 matches()를 사용해 비교합니다.
4.1 로그인 쿼리 수정
<select id="loginMember" parameterType="MemberVO" resultType="MemberVO">
SELECT mem_id, mem_pw, mem_name
FROM members
WHERE mem_id = #{memId}
AND del_yn = 'N'
</select>
4.2 Controller에서 matches()로 검증
@RequestMapping("/loginDo")
public String loginDo(MemberVO member, HttpSession session) throws Exception {
MemberVO login = memberService.loginMember(member);
boolean match = false;
if (login != null) {
match = passwordEncoder.matches(member.getMemPw(), login.getMemPw());
}
if (login == null || !match) {
return "redirect:/loginView?msg=N";
}
session.setAttribute("login", login);
return "redirect:/";
}
동작 원리: DB의 암호화된 비밀번호에서
salt를 추출하고, 입력값을 다시 암호화해 비교합니다.🎉 마무리
이제 여러분의 프로젝트는 BCrypt 기반의 안전한 인증 시스템을 갖추게 되었습니다. 이 가이드를 따라가며 단단한 보안 토대를 다져보세요!
'SPRING' 카테고리의 다른 글
| Spring.스프링 프레임워크 - 페이징 (0) | 2025.06.07 |
|---|---|
| Spring.스프링 프레임워크 - Rest (0) | 2025.06.07 |
| Spring.스프링 프레임워크 - 로그 (2) | 2025.06.03 |
| Spring.스프링 프레임워크 - 프로필 (1) | 2025.06.03 |
| Spring.스프링 프레임워크 - 댓글 (1) | 2025.06.03 |