Skip to content

Comments

[정종현] sprint9#328

Open
JJHyunDev wants to merge 89 commits intocodeit-bootcamp-spring:part2-정종현from
JJHyunDev:part4-정종현-sprint9

Hidden character warning

The head ref may contain hidden characters: "part4-\uc815\uc885\ud604-sprint9"
Open

[정종현] sprint9#328
JJHyunDev wants to merge 89 commits intocodeit-bootcamp-spring:part2-정종현from
JJHyunDev:part4-정종현-sprint9

Conversation

@JJHyunDev
Copy link
Collaborator

요구사항

기본 요구사항

Spring Security 환경 설정

  • 프로젝트에 Spring Security 의존성을 추가하세요.
  • Security 설정 클래스를 생성하세요.
  • SecurityFilterChain Bean을 선언하세요.
  • 가장 기본적인 SecurityFilterChain을 등록하고, 이때 등록되는 필터 목록을 디버깅해보세요. 필터 목록은 PR에 첨부하세요.
  • 모든 요청에 대해 인증이 수행되도록 하세요.
  • /api/를 포함하지 않는 모든 url에 대한 요청(정적 리소스, swagger, actuator 등)은 인증을 수행하지 않도록 하세요.
  • LogoutFilter를 제외하세요.
  • 개발 환경에서 Spring Security 모듈의 로깅 레벨을 trace로 설정하세요.

CSRF 보호 설정하기

  • CSRF 토큰을 발급하는 API를 구현하세요.
  • CSRF 토큰을 발급하는 API는 인증하지 않도록 SecurityFilterChain을 리팩토링하세요.

회원가입 고도화

  • 회원가입 API 스펙은 유지합니다.
  • 회원가입 시 비밀번호는 PasswordEncoder를 통해 해시로 저장하세요.
  • 회원가입 API는 인증하지 않도록 SecurityFilterChain을 리팩토링하세요.

기본 인증 구현

  • 다음의 조건을 만족하는 필터와 AuthenticationProvider를 구현하세요.
    • 로그인 API 스펙은 다음과 같습니다.
    • 기존에 구현했던 로그인 관련 코드는 제거하세요.
      • AuthApi.login, AuthController.login
      • AuthService.login
      • LoginRequest
  • 다음의 주요 컴포넌트를 활용해 Spring Security의 기본 인증 플로우를 최대한 유지합니다.
  • 세션ID를 통해 사용자의 기본 정보(UserDto)를 가져올 수 있도록 API를 정의하세요.

로그아웃

  • 다음의 조건을 만족하는 필터를 구현하세요.
    • 로그아웃 API 스펙은 다음과 같습니다.
      • 엔드포인트 요청 응답
      • POST /api/auth/logout Header(자동 포함) Cookie: JSESSIONID=… 200 Void
  • CSRF 검사는 수행하지 않도록 합니다.
  • 해당 세션을 무효화 처리하세요.
  • SecurityContext를 초기화하세요.

권한 관리

  • 다음과 같이 권한을 정의하세요.
    • 관리자: ROLE_ADMIN
    • 채널 매니저: ROLE_CHANNEL_MANAGER
    • 일반 사용자: ROLE_USER
      • 각 권한은 계층 구조를 가집니다.
      • 관리자 > 채널 매니저 > 일반 사용자
  • 회원 가입 시 모든 사용자는 ROLE_USER 권한을 가집니다.
  • 애플리케이션 실행 시 ROLE_ADMIN 권한을 가진 계정이 초기화되도록 구현하세요.
  • UserDto에 권한 정보를 포함하세요.
  • 사용자 권한을 수정하는 API를 구현하세요.
  • 권한이 수정된 사용자가 로그인 상태라면, 강제 로그아웃 되도록 합니다.

인가 처리

  • 회원가입, 로그인, csrf 토큰 발급 등을 제외한 모든 API는 최소 ROLE_USER 권한을 가져야합니다.
  • 퍼블릭 채널 생성, 수정, 삭제는 최소 ROLE_CHANNEL_MANAGER 권한을 가져야합니다.
  • 사용자 권한 수정은 ROLE_ADMIN 권한을 가져야합니다.

심화 요구사항

Remember-Me

다음의 조건을 만족하도록 로그인 유지 기능을 구현하세요.

  • 토큰은 데이터베이스에 저장하세요.
  • 쿠키에 저장되는 토큰의 유효기간은 3주로 지정하세요.
  • 로그아웃 시 데이터베이스에 저장된 토큰을 삭제하고, 클라이언트 쿠키도 삭제하세요.

동시 로그인 제한

  • 하나의 사용자 ID로 동시 로그인을 제한하세요. 새로운 로그인 발생 시 기존 세션을 무효화하세요.

세션 고정 보호

  • 세션 고정 보호를 위해 필요한 설정을 구현하세요.

사용자 로그인 상태 고도화

  • Session 정보를 활용해 사용자의 로그인 상태를 판단하도록 리팩토링하세요.
  • UserStatus 엔티티와 관련된 모든 코드는 삭제하세요.

인가 고도화

  • 사용자 정보 수정, 삭제는 본인 또는 ROLE_ADMIN 권한을 가진 사용자만 호출할 수 있습니다.
  • 메시지 수정은 메시지를 작성한 사람만 호출할 수 있습니다.
  • 메시지 삭제는 메시지를 작성한 사람 또는 ROLE_ADMIN 권한을 가진 사용자만 호출할 수 있습니다.
  • 읽음 상태 생성, 수정은 본인만 호출할 수 있습니다.

jiwoo-im and others added 30 commits February 6, 2025 12:56
User, Message, Channel 도메인 모델 구현
- 설계한 서비스 인터페이스 추가
- 해당 인터페이스의 구현체 구현
- 각 도메인 모델별 CRUD
- JCFx메모리 기반
- MessageService, UserService, ChannelService 인스턴스 생성 및 초기화
- 기본 실행 로직 구현
-(User, Channel, Message) extends BaseEntity

-공통 속성 BaseEntity로 리팩토링

-Override toString()
-(User, Channel, Message) 생성 메서드 매개변수, return type 변경
-(User, Channel, Message) toString 에 TimeFormmater.format() 설정 추가
-인터페이스 수정에 따른 save 메서드 수정

-출력 포멧 toString으로 간소화

-stream API 도입
-Service 구현체 Singleton 구현

-MessageService에 UserService, ChannelService 의존성 추가
-Service 간 의존성 추가

-saveMessage 의존성 검증 로직 추가
timeformatter parttern 으로 입력 받아서 format type 설정
interface method return type edit void to List, Optional
edit Entitiy set method validation
System.out.println() -> throw new exception()

interface method return type 변경으로 구현체 return type 변경

테스트 일부 수정
Entity, service interface 일부 수정
이후 미션을 위해 코드잇에서 제공해준 코드로 변경

스프린트 미션3 기본 요구사항 구현
ReadStatus, UserStatus, BinaryContent 추가

각 도메인 모델 별 Repository interface 선언
@JJHyunDev JJHyunDev requested a review from roeniss July 6, 2025 15:23
@JJHyunDev JJHyunDev added the 순한맛🐑 마음이 많이 여립니다.. label Jul 6, 2025
@roeniss roeniss self-assigned this Jul 6, 2025
@roeniss
Copy link
Collaborator

roeniss commented Jul 6, 2025

원 PR 은 자정 전에 제출 완료되었으나 브랜치 오류로 재제출 — 정시에 제출 성공한 것으로 간주하겠습니다.

Copy link
Collaborator

@roeniss roeniss left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

구현을 깔끔하게 잘 해내신 것 같습니다. 추가로 두 가지 정도만 언급하고 싶은데요,

  • 테스트코드에도 관심을 주면 더욱 좋을 것 같습니다.
  • (잡지식) 코드 중에 "implies(...)" 로 ROLE 의 hierarchy 를 잡는 부분이 있는데요, 이런 부분을 처리하기 위한 별도의 언어들도 있습니다. Policy-as-a-code 라고, 권한 시스템을 프로그래밍(?) 언어로 표현한 것이지요. https://www.permit.io/blog/what-is-policy-as-code 같은걸 보시면 좋을 것 같습니다.

Comment on lines +83 to +92
@Bean
public String debugFilterChain(@Qualifier("filterChain") SecurityFilterChain chain) {
log.debug("Debug Filter Chain...");
int filterSize = chain.getFilters().size();
IntStream.range(0, filterSize)
.forEach(idx -> {
log.debug("[{}/{}] {}", idx + 1, filterSize, chain.getFilters().get(idx));
});
return "debugFilterChain";
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이런 공부는 너무 좋다고 생각합니다. 하지만 여기 코드에선 빠져있거나 주석처리 하는 편이 좋았을 것 같아요

Comment on lines +14 to +17
@Override
public void run(ApplicationArguments args) throws Exception {

}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why it's blank?

@roeniss roeniss removed their assignment Jul 22, 2025
@roeniss roeniss assigned roeniss and unassigned roeniss Aug 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

순한맛🐑 마음이 많이 여립니다..

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants