IT

스프링시큐리티인액션 챕터3 정리

프로개발러 2023. 6. 20. 15:07
반응형

사용자 기술하기

 

스프링시큐리티 사용자 정의는 UserDetails 계약을 준수해야 .

 

UserDetails ?

참고로 개발한 사람은 Ben Alex

사람이 스프링소스 개발함

 

 

Userdetails 목적은

 

구현은 보안 목적으로 Spring Security에서 직접 사용되지 않습니다.

나중에 인증 개체로 캡슐화되는 사용자 정보를 저장합니다.

 이를 통해 보안과 관련되지 않은 사용자 정보(이메일 주소, 전화번호 등)를 편리한 위치에 저장할 수 있습니다.

 

 

사용방법은 크게 2가지가 있음.

 

1 userdetails 인터페이스 상속

 

 

정리하면 User -> 개인정보 포함한 정보(+UserDetails 포함)

UserDetails -> 권한관련정보만

 

참고로 User 이미 UserDetails 상속받음

 

 

getAuthorities

 

 

만약 권한을 부여하고 싶다면 getAuthorities 사용

사용하고 싶지 않다면

그냥 null 처리

참고로 위의 방식은 권한을 가져오는 방식.

그럼 권한 재정의는?

 

 

Public class class_name extends User{

Private static final String ROLE_PREFIX="ROLE_";

 

          //생성자

Public class_name(…. , String codeMemberType){

super(...,getAuthorities(codeMemberType));

}

 

Private static Collection<?extends GrantedAuthority>getAuthorities(String codeMemberType){

return getGrantedAuthorities(getRoles(codeMemberType));

}

 

Private static List<GrantedAuthority>getGrantedAuthorities(List<String> roles){

Return roles.stream()

.map(role->new SimpleGrantedAuthority(ROLE_PREFIX+role))

.collect(Collectors.toList());

}

 

private static List<String>getRoles(String codeMemberType){

List<String>roles=new ArrayList<>();

roles.add(codeMemberType);

return roles;

}

 

}

 

사용하면 ROLE_ 권한에다가 붙여서 재정의함.

 

 

원래 아래 파라미터를 받는 메소드가 없기 때문에 재정의 필요.

Private static Collection<?extends GrantedAuthority>getAuthorities(String codeMemberType){

return getGrantedAuthorities(getRoles(codeMemberType));

}

 

1)getRoles 메소드 통해서 string parameter 받음

2)list<string>타입으로 리턴

3)getGrantedAuthorities 메소드를 통해서 List<GrantedAuthority> 타입으로 리턴 / SimpleGrantedAuthority 사용

 

 

Builder사용해서userdetails 형식의 인스턴스 만들기

아래와 같이 빌더 사용

Users.builder() 사용하기 위해서

@Builder어노테이션 사용

 

 

 

 

보통 jpa 연동할 인스턴스를 넘겨주는 값으로 빌더를 사용

 

 

 

 

UserDetailsService?

 

 

오버라이딩해서 사용하기도 .

 

 

책에서는 Configuraton 어노테이션 사용해서

@Bean 어노테이션을 통해 UserDetailsService 메소드 사용

 

 

사용자 관리에 LdapUserDetailsManager 이용???

LDAP? 들어봤는데 뭐였지?

 

LDAP란 Lightweight Directory Access Protocol의 약자이고, 경량 디렉터리 접근 프로토콜

 

출처: <https://it-techtree.tistory.com/entry/Java-Apply-Security-SpringBoot-Application-With-LDAP>

LDAP는 X.500이라는 Directory Access Protocol의 경량화된 버전이라고 불리며, TCP/IP Layer위에서 동작합니다. 그러므로, HTTP 프로토콜과 유사하게 Request, Reponse를 가지며, 프로토콜 Schema도 ldap://xxxx.xxxx.xx:port와 같은 형태로 URL이 정의되므로, HTTP와 유사한 점이 많습니다. HTTP는 익명의 누군가라도 Request를 전송하고, Response를 받아 정보를 받을 수 있는 반면, LDAP는 인증된 유저에 대해서만 Request에 대한 Response을 받을 수 있습니다. 그리고, HTTP은 평문(Plain Text)으로 전송하여, 패킷을 가로채면 누구나 해당 내용을 확인이 가능하지만, LDAP는 전송 데이터에 대한 Base64와 같은 인코딩이 적용되어 Binary 포맷으로 데이터를 전송합니다. 그러므로, HTTP보단 LDAP가 보안성이 더 좋겠죠? LDAP는 LDIF(LDAP Data Interchange Format) 데이터 포맷으로 데이터를 데이터베이스에 저장합니다. 데이터 저장 구성요소는 아래와 같습니다.

 

출처: <https://it-techtree.tistory.com/entry/Java-Apply-Security-SpringBoot-Application-With-LDAP>

 

=>LDAP 프로토콜은 평문 가로채도 데이터 못봄.

 

 

그럼 https???

 

참고로 ldap

https://jumpcloud.com/blog/ldap-vs-ldaps

레거시 애플리케이션 구성은 여전히 ​​로컬 환경의 일부 디렉터리 바인드에 일반 텍스트 LDAP를 사용할 수 있습니다. 이러한 전통적인 LDAP 바인딩은 과거의 강화된 LAN 내에서 상대적으로 무해했지만 최신 보안 기준에서는 암호 스니핑 및 기타 형태의 자격 증명 도용으로부터 보호하기 위해 전송 중인 모든 사용자 자격 증명을 암호화해야 합니다.

 

 

참고로 책에 나오는 방법은 ldap방법으로 ldaps방법과는 다름.

 

책에 나온대로 ldap 적용하면 문제됨.

 

정리하자면 Ldap 사용하면서 https 인증서 적용하면 가장 안전한 방식.

 

3 정리 .

반응형