java, spring

[Spring] 스프링 시큐리티 로그인 (커스텀 데이터베이스 사용)

isaac.kim 2021. 10. 1. 01:34
728x90
반응형

[Spring] 스프링 시큐리티 로그인 (커스텀 데이터베이스 사용)

 

이전 글

2021.09.30 - [Spring] - [Spring] JDBC를 이용하는 간편 인증/권한 처리

2021.09.27 - [Spring] - CSRF(Cross-site request forgery) 공격과 토큰 / 로그인 처리 / 로그아웃 처

2021.09.27 - [Spring] - [Spring] 스프링 시큐리티를 사용하는 커스텀 로그인 페이지

2021.09.25 - [Spring] - [Spring] 스프링 시큐리티 간단한 로그인과 로그아웃 처리

2021.09.24 - [Spring] - [Spring] Spring Web Security의 설정

2021.09.24 - [Spring] - [Spring] Spring Web Security


스프링 시큐리티에서 인메모리 방식이나 지정 테이블(users 등) 방식이 아닌 기존의 테이블을 이용하는 경우에 대해서 알아보겠습니다.

 

JDBC를 이용하고 기존에 테이블이 있다면 약간의 지정된 결과를 반환하는 쿼리를 작성해 주는 작업으로도 처리가 가능합니다.

 

<security:jdbc-user-service> 태그에는 다음 속성을 지정할 수 있습니다.

 

'users-by-username-query' 속성과 'authorities-by-user-name-query' 속성

적당한 쿼리문을 지정해 주면 JDBC를 이용하는 설정을 그대로 사용할 수 있습니다.

 

먼저 일반적인 테이블을 생성합니다.

 


일반적인 회원 테이블과 권한 테이블

회원 테이블

권한 테이블


BCryptPasswordEncoder 클래스를 이용한 패스워드 보호

스프링 시큐리티에서 제공되는 BCryptPasswordEncoder 클래스를 이용해서 패스워드를 암호화해서 처리하도록 합니다. bcrypt는 태생 자체가 패스워드를 저장하는 용도로 설계된 해시 함수로 특정 문자열을 암호화하고, 체크하는 쪽에서는 암호화된 패스워드가 가능한 패스워드인지만 확인하고 다시 원문으로 되돌리지는 못합니다.

 

BcryptPasswordEncoder는 이미 스프링 시큐리티의 API 안에 포함되어 있으므로, 이를 활용해서 security-context.xml에 설정합니다. (기존의 CustomNoOpPasswordEncoder는 사용하지 않으므로 삭제 혹은 주석 처리합니다.)

 

security-context.xml의 일부

중략

bcrypt 방식을 이용하는 PasswordEncoder는 이미 스프링 시큐리티에서 제공하므로 이를 빈으로 추가하고, PasswordEncoder는 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder로 지정합니다.


인코딩된 패스워드를 가지는 사용자 추가

실제 데이터베이스에 기록하는 회원 정보는 BcryptPasswordEncoder를 이용해서 암호화된 상태로 넣어주어야 하므로 테스트 코드를 작성해서 처리합니다.

 

테스트 코드를 실행하기 위해서는 pom.xml에 spring-test가 추가되어야 합니다.

 

src/test/java 내에 com.project.security 패키지를 생성하고, MemberTests 클래스를 추가합니다.

 

MemberTests 클래스

MemberTests에는 PasswordEncoder와 DataSource를 주입해서 100명의 회원 정보를 기록합니다. PasswordEncoder를 이용해 암호화된 문자열을 추가하는 과정을 통하기 때문에 위 코드를 실행하고 나면 BcryptPasswordEncoder를 이용해서 암호화된 패스워드가 기록된 것을 확인할 수 있습니다.

생성된 사용자에 권한 추가하기

tb_member_auth 테이블에 유저 권한을 추가합니다.

 

'user00~user79' 까지는 'ROLE_USER' 권한을,

'manager80~manager89' 까지는 'ROLE_MEMBER' 권한을,

'admin90~admin99' 까지는 'ROLE_ADMIN' 권한을 부여

 

하는 코드를 다음과 같이 작성해 실행합니다.

 

MemberTests 클래스의 일부


쿼리를 이용하는 인증

이전 글에서 다루었던 지정된 방식이 아닌 테이블 구조를 이용하는 경우에는

인증을 하는데 필요한 쿼리(users-by-username-query)와 

권한을 확인하는데 필요한 쿼리(authorities-by-username-query)를 이용해서 처리합니다.

 

security-context.xml의 일부

브라우저를 통해 생성된 계정으로 로그인하면 정상적으로 처리되는 것을 확인할 수 있습니다.

 

브라우저를 통해 /sample/member 로 접속하기 위해 'manager85 / pw85 로 로그인하면 다음과 같이 정상적으로 처리되는 것을 확인할 수 있습니다.


커스텀으로 만든 테이블로 스프링 시큐리티를 이용해서 로그인하는 과정을 알아보았습니다.

728x90
반응형