-
Notifications
You must be signed in to change notification settings - Fork 1
TIL 1월 24일
GyuHyeon Park edited this page Feb 22, 2023
·
12 revisions
- 버그 하나를 잡으면 다른게 튀어나온다
- 기초 미디어 서버 제작 끝난 것 같음
- bug fix만 남은건가..?
- signaling 서버와 저장할 DB에 대해 이야기 나눠봐야한다 미디어서버 아직 우리 REPO에 형식에 맞게 넣을 준비가 안된 것 같아 제 깃헙에 따로 올려두었습니다
- 뭔가 찝찝한 이기분... 뭐지🧐
- 고려했던 모든 BUG는 고쳐두었다
- socket.io 뭔가 깊숙하게 파고들수록 편의성이 나타나는 것 같은데 아직 적응이 안된다
emit, on, callback으로 왠만한 연결성은 다 잡을 수 있다
더 구체적으로 작업하기 위해선 레퍼런스 더욱 봐야할 듯 - exceptional 한 경우에 대한 문제를 잡아봐야한다
- README정리
- bugfix추가적으로 진행
- typescript 관련공부
- react 기본 함수 + react router dom 다시보기
- typescript 강의를 들으면서 리액트를 기초 부터 같이 돌아보면 좋을 거 같다고 생각했고, 같이 보면서 확실히 관련 개념이 부족했던거 같았음.
- 프로젝트 내에서 구현해야 할 요소들 관련해서 자료 정리를 해두는 게 확실히 좋은것 같음, 전에 dragdrop이라던가
- 노션에 정리해둔거 추가하기(useEffect, useNavigate, Link 등 어떠한 상황에 사용하고 어떻게 적용하는 지 정리한내용 + 레퍼런스 들)
- 스터디 하면서 타입스크립트 강의 마저 듣기
- 구현할 요소들 정리 해두기
- mysql과 nosql등 db에 대해 공부하고, 쿼리문을 익힘
- somthing..
- https://velog.io/@nari120/Node.js-%EA%B5%90%EA%B3%BC%EC%84%9C-%EA%B0%9C%EC%A0%95-2%ED%8C%90-7%EC%9E%A5-%EC%9A%94%EC%95%BD
- https://velog.io/@nari120/Node.js-%EA%B5%90%EA%B3%BC%EC%84%9C-%EA%B0%9C%EC%A0%95-2%ED%8C%90-8%EC%9E%A5-%EC%9A%94%EC%95%BD
- Spring Security 관련 공부
- 진짜 노답이라 느꼈는데, 하나씩 뜯어서 찾아보다 보니 조금은 알겠다.
- 아직 할 거 천지인데.. 여기에 시간이 이만큼 뺏기면 안되는데 걱정이 많다.
-
인증(Authentication): 해당 사용자가 본인이 맞는지를 확인하는 절차. -
인가(Authorization): 인증된 사용자가 요청한 '특정 자원' 에 접근 가능한지를 결정하는 절차 - Authentication 이 이루어지고 나서, Authorizatino이 이루어진다.
-
Authentication- 현재 접근하는 주체의 정보와 권한을 담은 인터페이스이다. Authentication 객체는 Security Context에 저장되며, SecurityContextHolder를 통하여 SecurityContext에 접근하고, SecurityContext를 통해 Authentication에 접근할 수 있다.
public interface Authentication extends Principal, Serializable {
// 현재 사용자의 권한 목록을 가져옴
Collection<? extends GrantedAuthority> getAuthorities();
// credential(주로 비밀번호)을 가져옴
Object getCredentials();
Object getDetails();
// Principal 객체를 가져옴
Object getPrincipal();
// 인증 여부를 가져옴
boolean isAuthenticated();
// 인증 여부를 설정함
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}-
SecurityContext- Authentication 객체를 보관하는 역할을 한다. SecurityContextHolder를 통해 Authenticatino 객체를 가져올 수 있다.
-
SecurityContextHolder- 보안 주체의 세부정부를 포함하여 응용프로개름의 현재 보안 컨텍스트에 대한 세부 정보가 저장된다.
- 보안 주체의 세부정부를 포함하여 응용프로개름의 현재 보안 컨텍스트에 대한 세부 정보가 저장된다.
-
UsernamePasswordAuthenticationToken- UsernamePasswordAuthenticationToken은 Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스로, User의 ID가 Principal 역할을 하고, Password가 Credential의 역할을 한다. UsernamePasswordAuthenticationToken의 첫 번째 생성자는 인증 전의 객체를 생성하고, 두번째 생성자는 인증이 완려된 객체를 생성한다.
public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationToken {
// 주로 사용자의 ID에 해당함
private final Object principal;
// 주로 사용자의 PW에 해당함
private Object credentials;
// 인증 완료 전의 객체 생성
public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
super(null);
this.principal = principal;
this.credentials = credentials;
setAuthenticated(false);
}
// 인증 완료 후의 객체 생성
public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
Collection<? extends GrantedAuthority> authorities) {
super(authorities);
this.principal = principal;
this.credentials = credentials;
super.setAuthenticated(true); // must use super, as we override
}
}
public abstract class AbstractAuthenticationToken implements Authentication, CredentialsContainer {
}-
AuthenticationProvider- AuthenticationProvider에서는 실제 인증에 대한 부분을 처리하는데, 인증 전의 Authentication객체를 받아서 인증이 완료된 객체를 반환하는 역할을 한다. 아래와 같은 AuthenticationProvider 인터페이스를 구현해서 Custom한 AuthenticationProvider을 작성해서 AuthenticationManager에 등록하면 된다.
public interface AuthenticationProvider {
// 인증 전의 Authenticaion 객체를 받아서 인증된 Authentication 객체를 반환
Authentication authenticate(Authentication var1) throws AuthenticationException;
boolean supports(Class<?> var1);
}-
Authentication Manager- 인증에 대한 부분은 SpringSecurity의 AuthenticatonManager를 통해서 처리하게 되는데, 실질적으로는 AuthenticationManager에 등록된 AuthenticationProvider에 의해 처리된다. 인증이 성공하면 2번째 생성자를 이용해 인증이 성공한(isAuthenticated=true) 객체를 생성하여 Security Context에 저장한다. 그리고 인증 상태를 유지하기 위해 세션에 보관하며, 인증이 실패한 경우에는 AuthenticationException를 발생시킨다.
- AuthenticationManager를 implements한 ProviderManager는 실제 인증 과정에 대한 로직을 가지고 있는 AuthenticationProvider를 List로 가지고 있으며, ProviderManager는 loop를 통해 모든 provider를 조회하면서 authenticate 처리를 한다.
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication) throws AuthenticationException;
}-
UserDetails- 인증에 성공하여 생성된 UserDetails는 Authentication 객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용된다. UserDetails 인터페이스를 살펴보면 아래와 같이 정보를 반환하는 메서드를 가지고 있다. UserDetails 를 implements 하여 처리할 수 있다.
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNotExpried();
boolean isAccountNonLocked();
boolean isCrendentailsNotExpired();
boolean isEnabled();
}-
UserDetailService- UserDetails 객체를 반환하는 단 하나의 메서드를 가지고 있는데 일반적으로 UserRepository에서 주입하여 DB와 연결하여 처리한다.
public interface UserDetailsService {
UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException
}
-
GrantedAuthority- GrantAuthority는 현재 사용자(principal)가 가지고 있는 권한을 의미한다. ROLE_ADMIN이나 ROLE_USER와 같이 ROLE_*의 형태로 사용하며, 보통 "roles"라고 한다. GrantedAuthority 객체는 UserDetailsService에 의해 불러올 수 있고, 특정 자원에 대한 권한이 있는지를 검사하여 접근 허용 여부를 결정한다.
-
PasswordEncoding- AuthenticationManagerBuilder.userDetailsService().passwordEncoder()를 통해 패스워드 암호화에 사용될 PasswordEncoder 구현체를 지정할 수 있다.
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}- react-query + typescript 에러 문제 해결하기 (아직도 해결 못함…)
- 날이 지날수록 목이 너무 아프다 🥲 컨디션도 좋지 않아서 공부를 많이 하지 못했다.
- useMutation 타입을 공부하고, 이를 참고해서 타입을 지정해주었는데에도 자꾸 ‘No overload matches this call’ 에러가 발생한다. 타입을 잘못 지정해줘서 발생하는 것 같은데… 어디가 잘못된지 눈에 보이지 않고 문제가 해결되지 않으니 답답하다.
- unique한 id를 주기 위해서 uuid 라이브러리를 설치해서 사용하기보다는 js의 API인 crypto의 randomUUID를 사용하자!
- useQuery와 useMutation의 타입은 다음과 같다.
-
useQuery
export function useQuery< TQueryFnData = unknown, TError = unknown, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey >
- TQueryFnData: useQuery로 실행하는 query function의 리턴 값의 제네릭 타입
- TError: query function의 error 형식을 정하는 제네릭 타입
- TData: 받아온 데이터의 타입(query function의 데이터를 2차 가공하는 경우에만 사용함)
- TQueryKey: queryKey의 타입을 명시적으로 지정해주는 제네릭 타입
-
useMutation
export function useMutaion< TData = unknown, TError = unknown, TVariables = void, TContext = unknown >
- TData: useMutation에서 넘겨준 mutation 비동기 함수의 실행 결과의 타입
- TError: useMutation에서 넘겨준 mutation 비동기 함수의 에러 결과의 타입
- TVariables: mutate 함수에 전달할 인자를 지정하는 제네릭 타입
- TContext: onMutate 콜백 함수의 리턴 값을 지정하는 타입
-
참고 자료: https://gusrb3164.github.io/web/2022/01/23/react-query-typescript/
- 타입스크립트 강의 듣기!