본문 바로가기

java/스프링인액션

챕터4 스프링 시큐리티

4.1 스프링 시큐리티 활성화

dependency 추가

1. 스프링 부트 시큐리티 스타터

2. 시큐리티 테스트 

 

 

09be91f7-31c2-4ad3-b16d-fd8a30b574a2

 

 

이걸 불러오기만 해도 보안 구성이 제공된다.

 

모든 http 요청 경로는 인증되어야 한다.

어떤 특정 역할, 권한이 없다

로그인 페이지가 따로 없다 -------------------> 로그인 페이지 필요함

http 기본 인증을 사용해서 인증된다  ----------> 서로 다른 http 요청 경로마다 서로 다른 보안 규칙을 적용 ex)홈페이지, 사용자 등록 페이지는 인증이 필요하지 않음

사용자는 하나만 있다. 비밀번호는 암호화해 준다

 

4.2 스프링 시큐리티 구성

 

이것 떄문에 인증이 안된다.

 Encoded password does not look like BCrypt 에러가 난다.

encoder() 함수 사용하지도 않는데. 존재만으로도 왜 막아버리지???

encoder를 지워주니 user1으로 로그인이 된다.

 

 

보안을 테스트할 때는

웹 브라우저를 

private

incognito 모드로 설정하는 것이 좋다.(구글 시크릿 모드)

=> 사용자의 검색 세션에 관한 데이터

쿠키, 임시 인터넷 파일, 열어 본 페이지 목록, 기타 데이터를 저장하지 못하도록 한다.

 

=> 브라우저 창을 열 때 마다 이전 세션의 사용 기록이 반영되지 않는

새로운 세션으로 시작된다.

 

한 명 이상의 사용자를 처리할 수 있도록 

사용자 정보를 유지, 관리하는 사용자 스토어를 구성하는 것.

  • 인메모리 사용자 스토어
  • JDBC 기반 사용자 스토어
  • LDAP 기반 사용자 스토어
  • 커스텀 사용자 명세 서비스

public class SecurityConfig extends WebSecurityConfigurerAdapter 

SecurityConfigWebSecurityConfigurerAdapter 의 서브 클래스이다.

 

 

1) 인메모리 사용자 스토어

메모리: 사용자 정보를 유지, 관리 할 수 있는 곳 하나가 메모리이다.

 

인메모리에 user1, user2를 구성했다.

 

인메모리 사용자 스토어: 테스트, 간단 어플리케이션에서는 편리함.

그러나 사용자 정보의 추가, 변경이 쉽지 않음 --> 보안 구성 코드를 변경한 후 어플리케이션을 다시 빌드하고 배포, 설치 해야함.

 

고객 스스로 사용자를 등록하고 자신의 정보를 변경할 수 있어야 한다. 따라서 인메모리 사용자 스토어는 적합하지 않음.

 

 

2) JDBC 사용자 스토어

 

 

 

4.3 웹 요청 보안 처리

 

 

 

사용자 비밀번호를 암호화 하지않아 발생한 오류.

 

스프링 시큐리티 5 버전부터는 의무적으로 PasswordEncoder를 사용해서 비밀번호를 암호화 해야한다.

user 테이블에는 비번이 암호화 안되어 있음...

 

 

 

 

3. LDAP 기반 사용자 스토어

LDAP 기반 인증

ldapAuthentication()  === jdbcAuthentication()와 같은 기능

 

jdbcAuthentication() ldapAuthentication()
JDBC LDAP
자바 데이터베이스 연결
java database connectivity
가벼운 책자 접근 약속
Lightweight Directory Access Protocol

자바에서 DB 프로그래밍을 하기 위해 사용 API 네트워크 상에서
조직이나 개인정보 혹은 파일이나 디바이스 정보 등을
찾아보는 것을 가능하게 만든 소프트웨어 프로토콜이다.
JDBC 드라이버 로드
DB 연결
DB에 SQL로 읽고 쓰기
DB 연결 종료
 

 

 

 

 

userSearchFilter()

groupSearchFilter()

LDAP 기본 쿼리의 필터를 제공하기 위해 사용.

 

 

 

비밀번호 비교 구성하기

LDAP 기본 인증 전략:

1) LDAP 서버에서 사용자가 직접 인증 받기

2) LDAP 서버에서 비밀번호 비교 방법 ---> .passwordCompare()//비밀번호를 비교하는 방법 LDAP 인증

로그인 form에 입력된 비밀번호 === 사용자의 LADP서버에 있는 userPassword속성 값

                                      과 비교함

.passwordAttribute("userPasscode")//userPasscode속성 값이 비교되어야 한다

 :: 비밀번호가 다른 속성에 있다면 passwordAttribute로 비밀번호 속성의 이름을 지정할 수 있다.

 

 

LDAP 서버는 어디에 있을까?

localhost:33389

LDAP 서버 접속된다.

 

url을 지정할 수 있다.

 

 

LDAP 서버가 시작될때는

classpath에서

찾을 수 있는 LDIF 파일로부터 : record는 하나 이상의 줄로 구성, 한쌍으로 된 name:value를 포함함, 빈줄로 구분

데이터를 읽어온다.




 

idif() 로 LDIF 파일을 찾을 수 있는 경로를 지정함

 

contextSource 자꾸 빨간줄

Link all references for a local rename (does not change references in other files)

 

 

 

 

 

The method contextSource() is undefined for the type 
 LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder>.PasswordCompareConfigurer

에러남

 

 

.and() 추가하면 됨

 

고맙다 외국인 친구

https://stackoverflow.com/questions/66252795/contextsource-is-undefined-for-the-type-passwordcompareconfigurer

 

 

 

4.4 사용자 인지

javax.persistence

 

 

 

4.5 로그아웃 버튼 추가, 사용자 정보 보여주기

 

 

 

 

키클락

keycloak

 

'java > 스프링인액션' 카테고리의 다른 글

[8.3] 카프카 사용하기  (0) 2021.12.04
[6.3] 스프링 데이터 REST  (0) 2021.11.27
[6.3]  (0) 2021.11.27
[챕터 3] 데이터로 작업하기 72~112p  (0) 2021.11.13
1주차  (0) 2021.11.07