지금까지의 Spring security의 인증과 권한은 지정해 놓은몇개의 아이디와 패스워드를 통해서 접근이가능했다.

이제부터는 JDBC를 이용하는 방식을 한번 알아보자
스프링 시큐리티에서는 사용자를 확인하는 '인증(Authentication)' 과 권한등을 부여하는 '인과(Authorization)'으로 나누어 볼 수 있습니다.
Authenticatoin Manager <- Provider <- UserDetailsService
UserDetailsService는 스프링 시큐리티 API 내에 이미 여러가지 구현 클래스들을 제공하고 있습니다.
- CachingUserDetailsService, InMemoryUserDetailsManager, JdbcDaoImple 등등..
이전의 예제에서 security-context.xml에 문자열을 고정한 방식은 InMemoryUserDetailsmanager를 이용한 방식이다.
<security-user-service> 부분을 제거한다 이방법은 InMemoryUserDetailsManager를 이용한 방법으로
JDBC를 이용한 방법을 사용하려면
<security:jdbc-user-service> 를 이용한다 속성으로
-- data-source-ref // 를사용하며 이것에 대한 내용은 root-context.xml에 dataSource가 Bean으로 등록되어 있어야 한다.
-- 추가 적으로 users-by-username-query // authorities-by-username-query 같은 경우는
로그인창에서 ID 부분이 username 으로 DB에서 로그인 하려는 ID와 PWD가 일치하는지와, 해당 ID가 가지고 있는 권한을 검색하여 해당 권한이 없으면 로그인이 실패하게 된다.


어랏.? 로그인을 시도했는데 실패 했다.

그 이유는 PasswordEncoding이 되어 있지 않기 때문에 그렇다 이전까지만 해도 {noop} 을통해서 PasswordEncoding을 하지 않아도 로그인이 되었지만 이제부터는 PasswordEncoding을 실시 해줘야 한다.
password-encoder를 해줄 Class를 생성해줍니다. 그리고 PasswordEncoder 를 상속해줍니다.

생성한 Class를 Security-context.xml에 등록한 후에
<security:password-encoder ref=""> 등록해줍니다.


그러면 정상적으로 로그인되는 것을 확인할 수 있습니다.
======================================================================================
기본 테이블인경우
users
- username, password, enabled
authorities
- username, authority
BCryptPasswordEncoder 클래스를 이용하여 패스워드를 보호하는 방법
Spring Security에서 제공되는 BCryptPasswordEncoder 를 이용하여 패스워드를 암호화 처리 해보도록 하자
security-context.xml에
bryptPasswordEncoder를 Bean으로 등록해준 후

<security:Password-encoder ref=""> 에 등록해줍니다.

그 후 TEST CODE를 짠후 INSERT 해보면

password Colume이 암호화 되어 들어간것으로 확인됩니다.

==========================================================================
tbl_member
- userid, userpw, username, regdate, updatedate, enabled
tbl_member_auth
- userid, auth
임의의 테이블일경우
* 추가적으로 해줘야 할게 있다
DB에 있는 Colume 명을 일치 시켜줘야 한다.
기본테이블을 사용할경우 username(id), password 가 기본이다. 하지만 임의의 테이블일경우 그렇지 않을 경우가 많다. 그래서 일치 시켜줘야 한다. 현재 tbl_member 테이블에는 userid, userpw가 username, password가 된다 이것을 일단
jsp에서 userid, userpw로 설정해준다음

security-context.xml에서 userid, userpw로 변경해줘야 한다.


그다음에 로그인을 실시해보면

로그인 과정이 정상적으로 실행되는 것을 확인할 수 있다.
실행 순서를 보니
JSP-> 설정한 /customLogin -> suers-by-username-query, authorities-by-username-query 를 통해서 인증을 받은 후
.CustomLoginSuccessHandler 으로 이동한 후 마지막으로 Handler에서 지정한 곳으로 이동하는것으로 볼수 있다.
DB의 컬럼명과 security-context.xml, JSP 속성명 을 일치 시켜주지 않으면
아래에 보다싶이 userid='' 값이 비어있는 것을 확인 할 수 있다.

======================================================================================
bcrypt 자체가 패스버드를 저장하는 용도로 설계된 해시 함수로 특정 문자열을 암호화하고, 체크하는 쪽에서는 암호화된 패스워드가 가능한 패스워드이지만 확인하고 원문으로 돌리지 못한다
* 복호화가 가능한지에 따라서 양방향/단방향으로 구분되고,
* 복호화 할때 사용하는 비밀키가 암호화할 때 그대로 사용되면 대칭키, 서로 다른 키를 사용하면 비대칭 키가된더.
즉 Bcrypt 암호화란 ?
- 단방향 알고리즘으로, 현재 Spring security 에서 채택하고 사용하는 가장 강력한 방호화 방식이다.
복호화란 방법보단
public boolean matches(CharSequence rawPassword, String encodedPassword) 매서드를 사용하여 확인하는데
사용자가 입력한 id, pwd를 통해서 DB에 있는 PWD(암호화된)를 불러와서
입력한 pwd와 암호화된 PWD를 비교하여 True일경우 일치 False일경우 불일치로 로그인여부를 확인한다.
'dev > Spring-security' 카테고리의 다른 글
[Spring] Spring Security 대략적인 흐름 (0) | 2022.08.06 |
---|---|
[Spring] spring security 중간정리 (0) | 2022.08.06 |
[Spring] UserDetailsService 활용 (0) | 2022.08.05 |
[Spring] Spring security - custom login page (0) | 2022.08.02 |
[Spring] spring security (setting, authentication 처리, 403처리) (0) | 2022.07.30 |