[Spring] 스프링 비밀번호 암호화

2018.10.08 13:02

졸리운_곰 조회 수:2224

[Spring] 스프링 비밀번호 암호화

 

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

개발자가 패스워드 암호화에서 알아야 할점 : http://egloos.zum.com/springmvc/v/520257

  1. 복호화(디코딩)가 불가능한 단방향 암호코드로 만들어져야 한다.
  2. 암호는 개발자나 관리자도 알 수 없어야 하며 이용자 이외에는 누구도 접근할 수 없는 형태여야 한다.
  3. 공격자가 예측할 수 없도록 솔트 처리를 해주어야 한다.
  • 데이터베이스에서 제공하는 (mysql , oracle 등) 암호화에 의존해서는 안된다.

물론 많은 중소 웹사이트들이 위와 같이 데이터베이스 단계에서 암호화를 많이 활용하고 있다. 그 이유는 코드 상의 복잡함을 줄이기 위한 불가피한 선택이었을 것이다. 하지만 이에 대한 치명적인 문제점이 발생할 수 있다. 만약 mysql 이나 oracle 등 의 특정 데이터베이스를 이용하고 있다고할 경우 스프링은 해당 DBMS에 독립될 수 없다. 즉, 갑자기 mysql 5대의 버전에서 oracle 10g로 넘어간다고 하자, 이 경우 데이터베이스에서 디자인한 비밀번호 암호화 프로세스를 다시 설정해주어야 한다. 허나 스프링 시큐리티를 이용한다면 이런 복잡한 암호화 단계를 개발영역으로 끌어들임과 동시에 코드 상의 복잡함도 대부분 축소할 수 있게 된다. 더욱이 스프링 시큐리티는 암호화 클래스를 빈으로 설정한 뒤 따로 주입받아 사용하기 때문에 기능의 확장에 있어서도 매우 자유롭다. 즉, DBMS에 종속되지 않고 높은 확장성을 지닐 수 있게된다는 장점이 있다.

결론 : 스프링시큐리티 > 데이터베이스 암호화

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

 

1 . 스프링 시큐리티 라이브러리 추가하기 : 이 라이브러리를 추가할 때 조심해야하는 것은 스프링 버전과 잘 맞는지 확인해야하는 것이다. 만일 잘 물리지 않는 버전을 사용했을 때 라이브러리를 날리고 다시설치해야한다.

<!--스프링시큐리티 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 생성 : 해당 xml 문서에는 비밀번호 암호화인코딩을 위한 bean을 추가해준다. 스프링 시큐리티 라이브러리에서 제공하는 BcryptPasswordEncoder 는 비밀번호 암호화 메서드, 인코딩된 비밀번호와 Raw 형태의 비밀번호를 비교해주는 메서드를 제공한다. 하지만 비밀번호를 디코딩하는 메서드는 지원하지 않는다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

<?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 을 읽어오도록 파라미터를 추가한다.

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
      /WEB-INF/spring/root-context.xml
      /WEB-INF/spring/spring-security.xml
  </param-value>

4 . 이제 BCryptPasswordEncoder 클래스에서 제공해주는 메서드를 의존성주입을 통해 사용할 수 있게되었다. 서비스 단에서 회원가입 시 비밀번호를 암호화 해주는 코드를 추가한다.

@Override
public void create(UserVO vo) throws Exception {

  String encPassword = passwordEncoder.encode(vo.getUser_password());
  vo.setUser_password(encPassword);
  logger.info("암호화된 비밀번호 : "+vo.getUser_password());

  dao.insertUser(vo); // 회원가입 DAO
}

5 . 이 후 DAO 에서 서비스에서 전달받은 vo 를 전달하면 데이터베이스에 인코딩된 데이터가 저장된다.

6 . 스프링시큐리티의 bcrypt 인코딩 비밀번호와 인코딩 되지 않은 비밀번호를 비교하는 메서드를 통해 로그인 기능을 구현할 수 있다. BCryptPasswordEncoder 빈의 matches(rawData , encodedData) 메서드를 활용하면 로우 데이터와 인코딩 데이터를 비교할 수 있게 된다.

@Override
public UserVO login(LoginDTO dto) throws Exception {
  // TODO Auto-generated method stub

  String pw = dao.getUserPw(dto.getUser_email()).getUser_password();
  logger.info("암호화 비밀번호"+pw);
  String rawPw = dto.getUser_password();
  logger.info("비밀번호"+rawPw);
  if(passwordEncoder.matches(rawPw, pw)) {
    logger.info("비밀번호 일치");
    dto.setUser_password(pw);
  }else {
    logger.info("비밀번호 불일치");    
  }  
  return dao.login(dto);
}

7 . 스프링 시큐리티의 BCryptPasswordEncoder 를 필요로 하는 작업 들 ( 비밀번호 변경, 비밀번호 찾기 등의 작업에 해당 작업을 추가한다. )

[출처] https://shj7242.github.io/2017/12/10/Spring31/

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
146 Connect to MSSQL Server in JPA file 졸리운_곰 2020.01.24 51
145 Tomcat 및 MySQL 관련 한글 인코딩 문제 졸리운_곰 2020.01.23 50
144 전자정부 표준 프레임워크 egov bootstrap 부트스트랩 적용 file 졸리운_곰 2020.01.15 2087
143 JHIPSTER로 빠르게 SPRING BOOT, ANGULAR PROJECT 세팅하기 file 졸리운_곰 2019.12.31 206
142 Spring Boot와 AngualrJS를 조합한 코드 자동 생성 도구(scaffolding) file 졸리운_곰 2019.12.31 39
141 spring security 파헤치기 (구조, 인증과정, 설정, 핸들러 및 암호화 예제, @Secured, @AuthenticationPrincipal, taglib) file 졸리운_곰 2019.04.06 246
140 DAO vs DTO(=VO) 개념 알아보기 졸리운_곰 2019.01.04 187
139 DAO / VO / DTO란? 졸리운_곰 2019.01.04 245
138 JSP get 전송을 수신페이지에서 hidden으로 받아 javascript에서 활용 졸리운_곰 2019.01.03 38
137 JSP와 자바스크립트간의 정보 전송방법 file 졸리운_곰 2019.01.03 63
136 Intellij 에서 spring boot + jsp 설정 file 졸리운_곰 2018.12.01 99
135 How to Setup Spring-Boot with ReactJS and Webpack 스프링부트와 ReactJS와 webpack 패키징 file 졸리운_곰 2018.10.28 47
134 Use React and Spring Boot to Build a Simple CRUD App 기본적인 스프링부트와 React.js의 CRUD 기능 구현 file 졸리운_곰 2018.10.28 144
133 Bootiful Development with Spring Boot and React 스프링 부트와 리엑트.js의 연동 file 졸리운_곰 2018.10.28 85
» [Spring] 스프링 비밀번호 암호화 졸리운_곰 2018.10.08 2224
131 cos.jar로 파일 업로드 하기 졸리운_곰 2018.09.11 180
130 React.js and Spring Data REST : react.js 자바 스프링 연동 file 졸리운_곰 2018.09.11 1962
129 How To Integrate React in JSP Application : React와 JSP 연동 file 졸리운_곰 2018.09.11 1365
128 [CKEditor] JSP에서 사용하기 졸리운_곰 2018.09.06 90
127 [JSP]톰캣 서버 IntelliJ 구동,JSP 간단한 예제 실행 file 졸리운_곰 2018.09.05 264
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED