SpringFramework/BASIC

[ BCrypt ] Spring-security 비밀번호 암호화, 복호화 로직 활용

유혁스쿨 2020. 9. 9. 20:03
728x90
반응형

Spring-security 

암호화 하기 위해서는 Spring-security에서 제공하는 클래스가 필요합니다.

스프링이 제공하는 spring-security모듈을 추가합니다.

<!-- Spring-security 모듈 -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>

Spring-security 라이브러리를 pom.xml에 추가하고 빌딩,업데이트를 완료합니다.

 

 

BCryptPasswordEncoder

비밀번호 암호화

본격적으로 암호화를 하기 위해서는 Spring-security에서 제공하는 클래스가 필요합니다.
BCryptPasswordEncoder 클래스입니다. 

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String securePw = encoder.encode(암호화 할 비밀번호);

 

 

BCryptPasswordEncoder 클래스 객체를 생성하고 객체를 통해 .encode() 메서드를 호출하여 비밀번호를 매개값으로 넣어준 뒤 인코딩합니다. 

인코딩된 값을 String타입으로 저장해줍니다. encode()메서드는 반환타입이 String입니다.

 

 

    @Autowired
    private IUserMapper mapper;
    
    @Override
    public void register(UserVO user) {
        /*회원 비밀번호를 암호화 인코딩*/
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        /*비밀번호 암호화하여 다시 user객체에 저장.*/
        String securePw = encoder.encode(user.getPassword());
        user.setPassword(securePw); //DB에 넘겨주기위해 암호화 된 비밀번호를 user 객체에 저장
        mapper.register(user);
    }

회원 가입을 할 때 비밀번호 암호화 과정은 컨트롤러로부터 DAO역할을 해주는 Mapper 인터페이스로 넘어가기 전 중간단계인 Service단에서 로직을 추가하여 비밀번호 암호화를 중간에서 가공하여 진행해 줍니다.

 

이렇게되면 DB에 암호화되어 비밀번호가 저장이됩니다.

 

 

비밀번호 복호화

 

DB에 저장되는 암호키와 로그인 혹은 입력 수정 삭제 작업 요청을할때 입력한 비밀번호를 똑같은 형태로 암호화하여
암호화된 두 값을 비교하여 일치하면 로그인을 성공시켜 주지만 그것은 HashCode를 사용하여 비교할때이며
Spring Security에서는 이 방법이 먹히지 않습니다.
Spring Security는 매번 랜덤키를 부여하기때문에 따로 디코딩작업을 추가해야합니다.

 

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();				
if(encoder.matches(입력받은 비교할 비밀번호, 이미 암호화된 비밀번호) {

matches()라는 메서드를 사용하여 입력받은 비밀번호를 굳이 다시 암호화 하지 않고
내부적으로 이미 저장되있는 security방식의 암호화 키를 복호화하여 비교해주고 일치하면 true
일치하지않다면 false를 때려 확인 결과를 논리값으로 반환해 줍니다.

String inputId = inputInfo.getAccount(); //JSP로부터 넘겨받은 입력한 비밀번호
UserVO user = service.selectOne(inputId); //id를 기준으로 정보를 불러와서 user객체에 담음		
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();				
if(encoder.matches(inputPw, user.getPassword())) {//넘겨받은 비밀번호와 user객체에 암호화된 비밀번호와 비교

 

 

728x90
반응형