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을 선언하세요.
개발 환경에서 Spring Security 모듈의 로깅 레벨을 trace로 설정하세요.
CSRF 보호 설정하기
디스코드잇은 CSR 방식이기 때문에 CSRF 토큰은 다음과 같이 처리합니다.
CsrfTokenRepository 구현체를 CookieCsrfTokenRepository로 설정하세요.
CsrfTokenRequestHandler 컴포넌트를 대체하세요.
CSRF 토큰을 발급하는 API를 구현하세요.
회원가입
인증 - 로그인
각 컴포넌트의 기본 구현체가 무엇인지 디버깅해보세요.
로그인을 처리할 url을 /api/auth/login로 설정하세요.
UserDetailsService 컴포넌트를 대체하세요.
UserDetails 컴포넌트를 대체하세요.
AuthenticationSuccessHandler 컴포넌트를 대체하세요.
AuthenticiationFailureHandler 컴포넌트를 대체하세요.
이제 로그인 처리는 SecurityFilterChain에서 모두 처리되기 때문에 기존에 구현했던 로그인 관련 코드는 제거하세요.
인증 - 세션을 활용한 현재 사용자 정보 조회
이전 버전까지의 디스코드잇 프론트엔드에서는 현재 사용자 정보를 브라우저의 세션 스토리지(user-storage)에서 관리해왔습니다.
브라우저의 세션 스토리지는 Javascript로 접근이 가능하기 때문에, XSS(Cross-Site Scripting) 공격에 취약합니다.
따라서 프론트엔드 2.0.x 부터는 사용자 정보를 브라우저의 메모리에서 관리하도록 변경되었습니다.
하지만, 메모리에 저장된 정보는 브라우저 새로고침 시 모두 삭제됩니다.
따라서 새로고침 시 쿠키에 저장된 세션 ID를 통해 현재 사용자 정보를 조회합니다.
인증 - 로그아웃
Spring Security의 logout 흐름은 그대로 유지하면서 필요한 부분만 대체합니다.
이번 미션에서는 2가지 요소를 대체합니다.
로그아웃을 처리할 url을 /api/auth/logout로 설정하세요.
LogoutSuccessHandler 컴포넌트를 대체하세요.
인가 - 권한 정의
다음과 같이 권한을 정의하세요.
데이터베이스 스키마를 변경하세요.
회원 가입 시 모든 사용자는 USER 권한을 기본 권한으로 설정하세요.
사용자 권한을 수정하는 API를 구현하세요.
애플리케이션 실행 시 ADMIN 권한을 가진 어드민 계정이 초기화되도록 구현하세요.
DiscodietUserDetails.getAuthorities를 수정하세요.
인가 - 권한 적용
authorizeHttpRequests를 활성화하고, 모든 요청을 인증하도록 설정하세요.
다음의 요청은 인증하지 않도록 설정하세요.
Method Security를 활성화하세요.
Service의 메소드 별로 아래의 조건에 맞게 권한을 수정하세요.
적절한 권한이 없는 경우 403 응답을 반환하세요.
RoleHierarchy를 활용해 권한의 계층 구조를 정의하세요.
심화
세션 관리 고도화
동일한 계정으로 동시 로그인할 수 없도록 설정하세요.
권한이 변경된 사용자가 로그인 상태라면 세션을 무효화하세요.
UserStatus 엔티티 대신 SessionRegistry를 활용해 사용자의 로그인 여부를 판단하도록 리팩토링하세요.
로그인 고도화 - RememberMe
권한 적용 고도화
주요 변경사항
스크린샷
멘토에게