SPRING

Spring.스프링 프레임워크 - 암호화

calla1013 2025. 6. 7. 12:10

 

Spring Security와 BCrypt를 이용한 비밀번호 암호화 완벽 가이드

안녕하세요! 개발자 여러분 👋
오늘은 Spring SecurityBCrypt를 사용하여 비밀번호를 안전하게 암호화하는 방법에 대해 단계별로 알아보겠습니다. 회원가입부터 로그인까지, 보안을 강화하는 실용적인 예제를 준비했어요!

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단계: 회원가입 시 비밀번호 암호화

컨트롤러에서 @AutowiredBCryptPasswordEncoder를 주입하고, 평문 비밀번호를 암호화하여 저장합니다.

@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 기반의 안전한 인증 시스템을 갖추게 되었습니다. 이 가이드를 따라가며 단단한 보안 토대를 다져보세요!