Kim VamPa

[Spring][쇼핑몰 프로젝트][9] 비밀번호 인코딩(BCryptPasswordEncoder 적용) - 1 본문

스프링 프레임워크/쇼핑몰 프로젝트

[Spring][쇼핑몰 프로젝트][9] 비밀번호 인코딩(BCryptPasswordEncoder 적용) - 1

Kim VamPa 2021. 1. 20. 13:53
728x90
반응형
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188

목표

회원가입 메서드 BCryptPasswordEncoder 클래스 적용

 

 실제 회사에서 사용할 웹 애플리케이션을 제작하고 있다고 가정하겠습니다. 우리는 비밀번호를 데이터베이스에 저장하고 있습니다. 데이터베이스 자체에 보안이 되어 있을 것이지만 만약 뚫리게 된다면 비밀번호가 무방비하게 노출된다는 문제점이 있습니다. 이러한 문제점을 보완하기 위해 비밀번호가 노출이 되더라도 알아볼 수 없도록 암호화하는 방법이 있을 것입니다. 비밀번호를 인코딩(암호화) 해주고 사용자가 제출한 비밀번호와 데이터베이스에 저장된 인코딩 된 비밀번호가 일치하는지 확인해주는 메서드를 제공해주는  클래스가 바로 BCryptPasswordEncoder 클래스입니다. 

 

 저는 두 번의 포스팅에 걸쳐서 회원가입 메서드와, 로그인 메서드에 BCryptePasswordEncoder 클래스의 메서드를 적용하고자 합니다. 회원가입 메서드에 적용하면 인코딩 된 비밀번호가 데이터베이스에 저장될 것입니다. 그리고 로그인 메서드에 적용하면 홈페이지 사용자가 제출한 비밀번호와 데이터베이스에 저장된 인코딩 된 비밀번호가 일치하는지를 확인할 수 있게 될 것입니다.(BCryptPasswordEncoder에 대한 정리는 [Spring][Spring Security]BCryptPasswordEncoder란?에 정리하였습니다.)

 

 이번 포스팅에선 BcryptPasswordEncoder를 사용하기 위한 기본적인 설정과 회원가입 메서드에 BcryptPasswordEncoder 클래스의 메서드를 적용해 보겠습니다.

 

 

순서

1. BCryptPasswordEncoder 기본 설정

   1.1 pom.xml 추가

   1.2 security-context.xml 생성 및 수정

   1.3 web.xml 수정

2. 회원가입 메서드 적용

3. 회원가입 테스트

 

 

1. BCryptPasswordEncoder 기본 설정

1.1 pom.xml 추가

 pom.xml에 아래와 같이 3가지를 추가해줍니다. 버전은 5.4.2로 설정하였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
        <!-- security -->
        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>5.4.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>5.4.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>5.4.2</version>
        </dependency>
 
cs

 

그림 1

 

1.2 security-context.xml 생성 및 수정

 Spring Security와 관련된 빈(bean)과 설정을 따로 관리하기 위해서 security-context.xml 파일을 새로 만들어서 설정하겠습니다.

 

 먼저 servlet-context.xml 파일이 있는 경로에 'Spring Bean Configuration File'을 통해서 'security-context' 이름의 파일을 'benas'와 'security' namespaces를 추가 해준 뒤 생성합니다.

* security namespace의 경우 버전이 적히지 않은 것을 선택해줍니다.

 

그림2

 

그림 3

 

그림 4

 

 

 생성한 파일에 BCryptPasswordEncoder를 빈(bean)으로 등록하기 위해 아래의 코드를 추가해줍니다.

 

1
2
3
 
<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
 

 

그림 5

 

 

1.3 web.xml 수정

 web.xml에서 servlet-context.xml의 경로가 적힌 태그 안에 줄 바꿈을 하여 동일하게 security-context.xml파일의 위치를 작성합니다. 해당 과정을 통해서 스프링이 security-conte.xml을 인식할 수 있도록 합니다.

 

그림 6 변경 전

 

그림 7 변경 후

 

2. 회원가입 메서드 적용

 가장 먼저 BCryptPasswordEncoder를 @Autowired 어노테이션을 이용해서 의존성 주입을 해줍니다. 변수는 자신이 원하는 이름을 작성하시면 됩니다. 

 

1
2
3
4
 
    @Autowired
    private BCryptPasswordEncoder pwEncoder;
 

 

그림 8

 


 회원가입 메서드를 수정할 차례입니다. 수정하기 앞서 기존 코드의 흐름을 살펴보겠습니다. 기존의 코드의 흐름은 사용자가 작성한 회원가입 정보를 MemberVO 클래스 타입의 member를 통해 데이터를 받아옵니다. 회원의 정보가 담긴 member를 매개변수로 한 memberJoin()메서드를 호출하게 되고 이를 통해 BOOK_MEMBER 테이블에 데이터를 insert 하는 쿼리문이 실행됩니다.

 

회원정보가 담긴 member  => memberJoin()을 호출하여 회원가입 쿼리 실행

 

 우리가 하고자 하는 바는 회원의 정보가 등록될 때 회원의 비밀번호를 그대로 등록하는 것이 아니라 비밀번호를 사람이 알아볼 수 없는 형태의 문자열로 인코딩을 한 후 저장하고자 합니다. 따라서 우리는 member객체에서 비밀번호를 꺼낸 뒤, 비밀번호를 BCryptPasswordEncoder클래스의 encode() 메서드를 사용하여 인코딩을 합니다. 인코딩을 한 비밀번호를 member객체에 다시 저장 한 뒤 memberJoin() 메서드를 실행하여 회원정보를 등록하는 쿼리문을 실행합니다.

 

회원정보가 담긴 member => member에 저장된 비밀번호를 꺼냄 => encode() 메서드를 통해 꺼낸 비밀번호 인코딩 => 인코딩 된 비밀번호를 member 객체에 다시 저장 => memberJoin()을 호출하여 회원가입 쿼리 실행

 

위의 전체적인 흐름을 기초로 코드를 작성해보겠습니다.


 

 회원가입 쿼리는 그대로 사용할 것이기 때문에 MemberController 클래스에 있는 코드만 수정해주면 됩니다. 회원가입 메서드에 return문을 제외하고 기존의 코드를 주석 처리를 하거나 지워줍니다. 

 

그림 9

 

 

 먼저 인코딩 되기 전 비밀번호와 인코딩 후 비밀번호를 잠시 저장시켜둘 String 타입의 변수를 선언합니다.

 

1
2
3
4
 
        String rawPw = "";            // 인코딩 전 비밀번호
        String encodePw = "";        // 인코딩 후 비밀번호
 

 

 member객체로부터 비밀번호 데이터를 얻어내서 해당 비밀번호 데이터를 인코딩한 뒤 다시 member객체에 저장시키는 코드를 추가해줍니다. 

 

1
2
3
4
5
6
7
8
 
        String rawPw = "";            // 인코딩 전 비밀번호
        String encodePw = "";        // 인코딩 후 비밀번호
        
        rawPw = member.getMemberPw();            // 비밀번호 데이터 얻음
        encodePw = pwEncoder.encode(rawPw);        // 비밀번호 인코딩
        member.setMemberPw(encodePw);            // 인코딩된 비밀번호 member객체에 다시 저장
 

 

 회원의 정보가 담긴 member 인스턴스를 인자 값으로 하는 memberJoin() 메서드를 호출하여 회원가입 쿼리가 실행되도록 코드를 작성합니다.

 

1
2
3
4
5
6
7
8
9
10
11
 
        String rawPw = "";            // 인코딩 전 비밀번호
        String encodePw = "";        // 인코딩 후 비밀번호
        
        rawPw = member.getMemberPw();            // 비밀번호 데이터 얻음
        encodePw = pwEncoder.encode(rawPw);        // 비밀번호 인코딩
        member.setMemberPw(encodePw);            // 인코딩된 비밀번호 member객체에 다시 저장
        
        /* 회원가입 쿼리 실행 */
        memberservice.memberJoin(member);
 

 

그림 10

이로써 인코딩 된 비밀번호가 저장되는 회원가입 메서드를 완성하였습니다.

 

3. 테스트

 테스트를위해 서버를 실행하여 회원가입을 하였습니다. 아이디는 'test5', 비밀번호는 '1234'로 하였습니다.

 

그림 11

 

 Oracle DB와 MySQL DB 각각 테스트해보았으며 그 결과는 아래와 같습니다. 보시다시피 분명 '1234'를 비밀번호를 입력하였지만 등록된 데이터는 인코딩 된 비밀번호 데이터가 저장된 것을 볼 수 있습니다.

 

그림 12 Oracle DB

 

그림 13 MySQL DB

 

 

DATE

  • 2020.12.20
728x90
반응형
Comments