본문 바로가기

패스트캠퍼스/100% 환급 챌린지_2

패스트캠퍼스 환급챌린지 10일차 : Netplix 구독형 멤버십 프로젝트로 배우는 Spring Security 강의 후기

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://abit.ly/lisbva

 

 

안녕하세요 :)

오늘은 챌린지 10일차로, 점식 먹기 전에 잠깐 공부를 하러 왔습니다.

 

오늘 배울 내용은,

Part A. 로그인, 로그아웃, 회원가입으로 배워보는 스프링 시큐리티 기초

Ch 3. UserDetails 와 사용자 관리

"01. UserDetails 살펴보기" 입니다.


 

오늘은 사용자 관리에 대해 배웠는데, 앞서 유저 정보를 관리하기 위해서 UserDetails 가 필요하다는 것을 배웠고 인터페이스를 이용하여 효과적으로 설계가 되어 있는 상태이다.

이번 시간에는 UserDetails 인터페이스에 대해 조금 더 디테일한 레벨에서 알아보았다.


사용자를 표현하는 UserDetails, 권한을 표현하는 GrantedAuthority, UserDetailsService, UserDetailsManager를 활용하여 사용자 만들기, 암호 수정 등의 커스텀한 작업을 지원한다. 다양한 유형의 UserDetailsManager (InMemoryUserDetailsManager, JdbcUserDetailsManager 등)도 있다.

사용자 관리를 위한 인터페이스는 UserDetailsService 와 UserDetailsManager 인터페이스를 이용하여 사용자 관리를 수행한다(CRUD 기능).
- UserDetailsService 는 사용자 이름으로 사용자를 검색한다(Read).
- UserDetailsManager 는 사용자 추가, 수정, 삭제 작업을 수행한다(Create, Update, Delete).

두 인터페이스의 분리는 5대 객체 지향 프로그래밍 원칙 (SOLID) 중 I 에 해당하는 Interface Segregation Principle 에 해당한다.


- 인터페이스 분리 원칙은 사용하지 않는 인터페이스에 강제로 의존해서는 안 되는 것을 말한다.

따라서, read와 write 관련 인터페이스를 분리해두었기 때문에 프레임워크의 유연성이 향상되고, 사용자를 인증하는 기능이 필요하면 UserDetailsService 인터페이스만 구현하면 된다. 또, 추가, 수정, 삭제 등 더 많은 기능을 제공해야 하면 UserDetailsManager 를 함께 구현하면 된다.


권한이란? 사용자에게 허가된 작업을 권한(authority) 이라고 한다. 애플리케이션에서 사용자가 수행할 수 있는 작업을 의미하며, 만약 권한이 없는 애플리케이션이라면 모든 사용자는 동등하다고 볼 수 있다.

권한이 존재하는 시스템으로는 백오피스 어드민에서 일반 사용자와 관리자를 구분해야 할 때, 일반 사용자 중에서 메뉴 A, B에 접근할 수 있는 사용자와 메뉴 C, D에 접근할 수 있는 사용자를 구분해야 할 때, 조회만 수행할 수 있는 사용자와 수정도 함께 할 수 있는 사용자를 구분해야 할 때, 이러한 작업을 할 때 GrantedAuthority로 할 수 있다.

GrantedAuthority 에 대해 알아보면, GrantedAuthority는 UserDetails 에서 사용되며 사용자에게 허가된 이용 권리를 나타낸다. 권한이 하나도 없거나 여러 권한을 가질 수 있고, 인터페이스이기 때문에 권한 클래스를 직접 구현하거나 이미 만들어진 SimpleGrantedAuthority 등을 활용할 수 있다.

GrantedAuthority를 활용하여 읽기 (READ) 권한 만드는 방법으로는, 람다 식을 이용하거나 SimpleGrantedAuthority 클래스를 이용하여 읽기 (READ) 권한을 선언할 수 있다.
예를 들면,
GrantedAuthority authority1 = new SimpleGrantedAuthority("READ");
GrantedAuthority authority2 = () -> "READ";

UserDetails 생성을 위해 빌더 패턴 활용하기 위한 방법에 대해 알아보면, 스프링 시큐리티 라이브러리에서 제공하는 User 클래스에는 UserDetails 생성을 위해 빌더를 제공한다. 이 빌더를 활용하기 위해서는 사용자 이름과 암호가 필요하며, 정보 입력 후 .build()를 통해 UserDetails 를 생성하면 된다.