Spring Security_basic. 비밀번호 암호화 / 복호화

dwanGim·2022년 7월 5일
0

spring_basic

목록 보기
28/41
post-thumbnail

비밀번호 암호화 / 복호화

스프링 시큐리티에서는 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을

입력하면 로그인에 성공하는 것을 확인할 수 있습니다.

profile
배울 게 참 많네요.

0개의 댓글