본문 바로가기

프로그래밍 /SPRING

[SPRING] 스프링 시큐리티 (비밀번호 암호화)


(Spring Security)란??


자바 애플리케이션에 인증과 권한 부여를 모두 제공하는 데 중점을 둔 프레임 워크 !!!





데이터베이스 암호화 방식 vs 스프링 시큐리티


 

데이터베이스에서 제공하는 (mysql , oracle 등) 암호화에 의해서만 의존해서는 안된다( 보안에 취약)!!!

많은 중소 웹사이트들 및 쇼핑사이트들이 위와 같이 데이터베이스 단계에서 암호화를 많이 활용중에 있다  

BUT!!! 

스프링 시큐리티를 이용한다면 이런 복잡한 암호화 단계를 개발영역으로 적용시키면서

 동시에 코드 상의 복잡함도 대부분 축소할 수 있게 된다.

게다가 스프링 시큐리티는 암호화 클래스를 BEAN 으로 설정한 뒤 따로 주입받아 사용하기 때문에

 기능의 확장에 있어서도 매우 자유롭다. 



비밀번호 암호화하기(스프링 시큐리티)


1.Pom.xml 설정 !!!


        <!--스프링시큐리티 web 라이브러리--> 스프링 시큐리티 버전 예민하므로 주의 !!!! 스프링 버전에 맞는 것으로 할것
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>4.1.0.RELEASE</version>
        </dependency>
        <!--스프링시큐리티 core 라이브러리-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>4.1.0.RELEASE</version>
        </dependency>
        <!--스프링시큐리티 config 라이브러리-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>4.1.0.RELEASE</version>
        </dependency>


2.spring-security.xml 생성하기


비밀번호 문서를 위한 bean 추가
BCryptPasswordEncoder 은 스프링 시큐리티에서 제공해주는 라이브러리 클래스
단 !!! 비밀번호 암호화 메서드 , 와 인코딩 된 비밀번호를 비교해주는 역할


<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                                http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/security
                                http://www.springframework.org/schema/security/spring-security.xsd">

    <beans:bean id="bcryptPasswordEncoder"
        class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

</beans:beans>

3.web.xml 에 spring security.xml 추가 해주기 


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/root-context.xml
            /WEB-INF/spring/spring-security.xml
        </param-value>
    </context-param>
    


4. 회원등록시 생성한 BCryptPasswordEncoder 서비스에서 사용 가능하게 적용 !!!

    @Inject
    PasswordEncoder passwordEncoder;

    @Override
    public void regist(MemberVO vo) throws Exception {
        
        System.out.println("서비스레지스");

        String encPassword = passwordEncoder.encode(vo.getMemberPassword());
        vo.setMemberPassword(encPassword);
        //System.out.println("암호화된 비밀번호 : "+user.getUserPassword());

        dao.insertUser(vo);
        System.out.println(vo);
        System.out.println("/////////////////////// 찍히"); 회원가입


..........

암호화 되어서  DB 들어가는 것을 확인

5. 로그인시 다시 디코딩해서 비교확인 !!!

//로그인
    @Override
    public MemberVO login(LoginDTO dto) throws Exception {
        System.out.println("service dto: "+dto);
        System.out.println("멤버서비스 dto");
        try {
            String pw = dao.getUserPw(dto.getMemberEmail()).getMemberPassword();
            String rawPw = dto.getMemberPassword();
            //System.out.println("db pW : "+pw);
            //System.out.println("입렵Pw:"+rawPw);
            //System.out.println(passwordEncoder.matches(rawPw, pw));
            if(passwordEncoder.matches(rawPw, pw)) {
                System.out.println("비밀번호 일치");
                dto.setMemberPassword(pw);
            }else {
                //============System.out.println("비밀번호 불일치");=======================
                //주석 해제 시 비 암호화 설정된 db Pw 값으로 로그인 되지 않음
                dto.setMemberPassword(pw);
            }
        }catch(NullPointerException npe){
            MemberVO vo=new MemberVO();
            vo=null;
            System.out.println(vo);
            return vo;
        }catch (Exception e){
            MemberVO vo=new MemberVO();
            vo=null;
            return vo;
        }
        return dao.login(dto);
    }


'프로그래밍 > SPRING' 카테고리의 다른 글

[SPRING] SPRING SECURITY 로그인 인증  (4) 2018.04.17
[SPRING] 이메일 인증  (4) 2018.02.27
[Spring] 스프링 MVC 패턴  (0) 2018.02.21
[Spring] 스프링 네이버 로그인 API 연동  (2) 2018.02.07
Spring Anntation  (0) 2018.01.30