비밀번호 암호화 / 복호화
스프링 시큐리티에서는 BcrtptPasswordEncoder를 통해
비밀번호 복호화를 지원하고 있습니다.
<!-- 비밀번호 복호화 -->
<bean id="bcryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
security - context.xml에 위와 같은 bean을 추가해줍니다.
그 후 비크립트인코더를 인증매니저에도 추가해주어야 합니다.
<!-- 인증 -->
<security:authentication-manager>
<security:authentication-provider>
<security:jdbc-user-service data-source-ref="dataSource"/>
<security:password-encoder ref="bcryptPasswordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
이제 저는 JUNIT을 이용한 테스트 코드를 작성해서
DB에 암호화 / 복호화가 잘 진행되는지 확인해보도록 하겠습니다.
데이터를 가져오는 DataSource와 복호화를 도와주는 PasswordEncoder 두 개의 bean을 @Autowired해주면
모든 test의 준비는 끝입니다.
package com.ict.security;
import java.sql.Connection;
import java.sql.PreparedStatement;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
"file:src/main/webapp/WEB-INF/spring/root-context.xml",
"file:src/main/webapp/WEB-INF/spring/security-context.xml"
})
@Log4j
public class MemberTests {
// 암호화 담당
@Autowired
private PasswordEncoder pwen;
// DB 접근 담당
@Autowired
private DataSource ds;
//@Test
public void testCryptDefaultDB() {
String[] idList = {"user00", "member00", "admin00"};
String sql = "UPDATE users SET password = ? WHERE username = ?";
try {
Connection con = ds.getConnection();
for(String id : idList) {
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, pwen.encode("pw00"));
pstmt.setString(2, id);
pstmt.executeUpdate();
}
} catch(Exception e) {
e.printStackTrace();
}
} //testCryptDefaultDB END
//@Test
public void testCryptCustomDB() {
try {
Connection con = ds.getConnection();
String sql = "INSERT INTO member_tbl(userid, userpw, username) VALUES (?,?,?)";
for(int i=0; i<30; i++) {
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(2, pwen.encode("pw"+i)); // userpw에 복호화 비번 입력
if(i<10) {
pstmt.setString(1, "user" + i);
pstmt.setString(3, "준회원" + i);
}else if(i <20) {
pstmt.setString(1, "user" + i);
pstmt.setString(3, "정회원" + i);
}else if(i<30) {
pstmt.setString(1, "user" + i);
pstmt.setString(3, "운영자" + i);
}
pstmt.execute();
} // for END
}catch(Exception e) {
e.printStackTrace();
}
} // testCryptCustomDB END
@Test
public void testInsertAuth() {
try {
Connection con = ds.getConnection();
String sql ="INSERT INTO member_auth(userid, auth) VALUES(?,?)";
for(int i =0; i < 30; i++) {
PreparedStatement pstmt = con.prepareStatement(sql);
if(i < 10) {
pstmt.setString(1, "user" + i);
pstmt.setString(2, "ROLE_USER");
} else if(i < 20) {
pstmt.setString(1, "user" + i);
pstmt.setString(2, "ROLE_MEMBER");
} else if(i < 30) {
pstmt.setString(1, "user" + i);
pstmt.setString(2, "ROLE_ADMIN");
}
pstmt.execute();
} // for END
} catch(Exception e) {
e.printStackTrace();
}
} //testInsertAuth END
}
작성한 테스트 코드의 전문입니다.
위에서부터 @Test 어노테이션에 걸려있는 주석을 지우고 더해가면서
하나씩 수행해보면 됩니다.
"user00", "member00", "admin00" 과 같은 간단한 아이디들을
for문에 넣고 insert해보았습니다.
admin00의 password는 암호화 되어있지만 복호화된 암호 pw00을
입력하면 로그인에 성공하는 것을 확인할 수 있습니다.