Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
요구사항
Spring Security 환경설정
프로젝트에 Spring Security 의존성을 추가하세요.
Security 설정 클래스를 생성하세요.
SecurityFilterChain Bean을 선언하세요.
가장 기본적인 SecurityFilterChain을 등록하고, 이때 등록되는 필터 목록을 디버깅해보세요. 필터 목록은 PR에 첨부하세요.
개발 환경에서 Spring Security 모듈의 로깅 레벨을 trace로 설정하세요.
CSRF 보호 설정하기
CsrfTokenRepository 구현체를 CookieCsrfTokenRepository로 설정하세요.
이때 클라이언트에서 쿠키에 저장된 CSRF 토큰에 접근해야 하므로 Http Only는 false로 설정합니다.
CsrfTokenRequestHandler 컴포넌트를 대체하세요.
디폴트 구현체는 XorCsrfTokenRequestAttributeHandler입니다.
Spring 공식문서에서 권장하는 CSR+SPA(Single Page Application) 환경에 적합한 구현체를 정의하세요.
CSRF 토큰을 발급하는 API를 구현하세요.
회원가입
인증 - 로그인
formLogin 을 기본값으로 활성화하고, 추가된 필터를 확인해보세요.
Spring Security의 formLogin 인증 흐름은 그대로 유지하면서 필요한 부분만 대체합니다.
로그인을 처리할 url을 /api/auth/login로 설정하세요.
UserDetailsService 컴포넌트를 대체하세요.
디폴트 구현체는 InMemoryUserDetailsManager입니다.
DiscodeitUserDetailsService를 정의하세요.
UserDetails 컴포넌트를 대체하세요.
디폴트 구현체는 org.springframework.security.core.userdetails.User입니다.
DiscodeitUserDetails를 정의하세요.
앞서 정의한 DiscodeitUserDetailsService에서 DiscodeitUserDetails를 생성 후 반환하세요.
AuthenticationSuccessHandler 컴포넌트를 대체하세요.
인증 성공 시 200 UserDto로 응답합니다.
AuthenticiationFailureHandler 컴포넌트를 대체하세요.
디폴트 구현체는 SimpleUrlAuthenticationFailureHandler입니다.
LoginFailureHandler를 정의하고 대체하세요.
이제 로그인 처리는 SecurityFilterChain에서 모두 처리되기 때문에 기존에 구현했던 로그인 관련 코드는 제거하세요.
인증 - 세션을 활용한 현재 사용자 정보 조회
인증 - 로그아웃
Spring Security의 logout 흐름은 그대로 유지하면서 필요한 부분만 대체합니다.
이번 미션에서는 2가지 요소를 대체합니다.
로그아웃을 처리할 url을 /api/auth/logout로 설정하세요.
LogoutSuccessHandler 컴포넌트를 대체하세요.
디폴트 구현체는 SimpleUrlLogoutSuccessHandler입니다.
HttpStatusReturningLogoutSuccessHandler로 대체하세요.
인가 - 권한 정의
faef2l3uk-image.png
관리자: ADMIN
채널 매니저: CHANNEL_MANAGER
일반 사용자: USER
데이터베이스 스키마를 변경하세요.
회원 가입 시 모든 사용자는 USER 권한을 기본 권한으로 설정하세요.
사용자 권한을 수정하는 API를 구현하세요.
API 스펙
엔드포인트: PUT /api/auth/role
요청: Body UserRoleUpdateRequest
응답: 200 UserDto
qu8jij3u4-image.png
애플리케이션 실행 시 ADMIN 권한을 가진 어드민 계정이 초기화되도록 구현하세요.
DiscodietUserDetails.getAuthorities를 수정하세요.
인가 - 권한 적용
authorizeHttpRequests를 활성화하고, 모든 요청을 인증하도록 설정하세요.
다음의 요청은 인증하지 않도록 설정하세요.
Method Security를 활성화하세요.
Service의 메소드 별로 아래의 조건에 맞게 권한을 수정하세요.
적절한 권한이 없는 경우 403 응답을 반환하세요.
RoleHierarchy를 활용해 권한의 계층 구조를 정의하세요.
심화
세션 관리 고도화
sessionConcurrency 설정을 활용하세요.
세션의 동일성을 보장하기 위해 DiscodeitUserDetails의 equals(), hashcode() 메소드를 오버라이딩하세요.
권한이 변경된 사용자가 로그인 상태라면 세션을 무효화하세요.
UserStatus 엔티티 대신 SessionRegistry를 활용해 사용자의 로그인 여부를 판단하도록 리팩토링하세요.
로그인 고도화 - RememberMe
로그인 요청 파라미터(remember-me)가 true인 경우 세션이 무효화되어도 자동으로 다시 로그인되도록 하세요.
로그인 화면에서 로그인 유지 체크 후 로그인하면 remember-me 파라미터가 true로 설정되어 요청합니다.
remeberMe 설정을 활용하세요.
로그인 상태에서 JESSIONID 쿠키를 삭제 후 새로고침했을 때 인증 상태가 유지 되는지 확인해보세요.
권한 적용 고도화
주요 변경사항
스크린샷
멘토에게