Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7강 과제 #84

Merged
merged 9 commits into from
Jul 18, 2023
Merged

7강 과제 #84

merged 9 commits into from
Jul 18, 2023

Conversation

EunjinJwa
Copy link

7강 과제입니다.

Comment on lines 66 to 70
private void checkUserAccess(Long targetUserId, Long requestUserId) {
if (!Objects.equals(targetUserId, requestUserId)) {
throw new AccessDeniedException("Access Denied : " + targetUserId);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

요청한 사용자와 리소스의 소유자가 다를 경우 요청을 거부하기 위해서 사용되는 메서드인 것 같아요. check라는 말은 너무 보편적이라서 다르게 해석될 여지가 많을 것 같아요.

그리고 수정하려는 리소스의 아이디와 요청하려는 아이디가 같은지 다른지는 도메인 모델에 관계없이 알 수 있는 거라서, Controller단에서 유효성을 검사하는 방법도 있을 것 같아요

Copy link
Author

Choose a reason for hiding this comment

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

앗 네이밍이 역시 고민이군용..!!ㅠ
UserAccessValidator 클래스를 생성하고 validateAuthorizeUserAccess() static 메서드로 변경했습니다.
User라는 리소스에 접근할 수 있는 권한이 있는가를 체크하는 메서드입니다.

Controller에서 확인하는게 맞지않나 싶었는데, 강의에서 Service로 하기에 생각없이 작성했네요🥲 반성합니다 ㅎㅎ

Filter authenticationErrorFilter = new AuthenticationErrorFilter();

http
.csrf().disable()
Copy link
Contributor

Choose a reason for hiding this comment

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

여기서 csrf를 왜 disable하는지 이유를 명확히 짚고 넘어가는 것도 좋겠습니다

Copy link
Author

Choose a reason for hiding this comment

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

사용자의 인증정보를 세션기반으로 서버나 브라우저에서 해당정보를 가지고 있을 수 있고 그 상태에서 위변조 요청이 가능하게됩니다.
해당 옵션을 활성화시키게 되면 브라우저에서 위변조 요청을 방지할만한 다른 정보를 함께 전송해야 합니다.
하지만 토큰 기반의 인증에서는 서버는 무상태로 요청을 받을 때마다 토큰의 유효성을 체크하게 되므로 서버에서는 인증정보를 가지고 있지 않습니다. 토큰 이외의 csrf 방지를 위한 개발요소를 추가하는 것이 불필요 하게 되므로 disable 시킨 거라고 이해했습니다.

아래 문서 참고
https://docs.spring.io/spring-security/reference/features/exploits/csrf.html

.addFilter(jwtAuthenticationFilter)
.addFilterBefore(authenticationErrorFilter, JwtAuthenticationFilter.class)
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // session 무상태 처리
Copy link
Contributor

Choose a reason for hiding this comment

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

여기서 무상태라는 것은 어떤 의미인가요? REST의 관점에서 설명해보는 것도 좋겠네요

Copy link
Author

@EunjinJwa EunjinJwa Jun 19, 2023

Choose a reason for hiding this comment

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

REST 요청에서는 요청의 전 후 연결에 관여하지 않습니다.
항상 지금의 요청에 대해서만 처리할 뿐이라 무상태(stateless) 라고 합니다.
security를 설정 할때도, JWT 인증 방식에서 서버는 유저의 로그인 상태를 세션등으로 따로 관리하지 않습니다.
로그인을 했다는 상태를 관리하는것이 아닌, 요청이 올때마다 토큰을 검증함으로써 인증/인가를 할 뿐입니다.

@hannut91 hannut91 merged commit 19b1a5d into CodeSoom:EunjinJwa Jul 18, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants