항해99/스프링 숙련
Spring 숙련 주차 개인 과제
숲별
2022. 12. 27. 23:51
728x90
- FormLogin을 활용할 때와 활용하지 않을 때 어떤 차이점이 있었나요?
- FormLogin은 http.formLogin().loginPage(“/login.html”) 과 같이 Spring 앱 내부에서 클라이언트 화면을 지정할 수 있습니다.
- 이 때는 Spring Security 이미 정의된 UsernamePasswordAuthenticationFilter를 활용해 AuthenticationManager에게 인증 토큰을 전달합니다.
- 이와 달리 JWT를 쓰게 되면, 이미 정의된 Filter가 아닌 우리가 직접 정의한 JWT를 검증할 수 있는 Filter를 만들고, 추가해주어야 하죠.
- Spring 앱 내부에서 클라이언트와 서버가 모두 구현된다면 Spring Security의 기본 FormLogin을 써도 무관하겠지만,
- 프론트와 안전하게 통신해야 하는 상황이기에 JWT를 활용하고, 직접 Filter도 만들어보았습니다.
- 추가적으로 Custom한 class들의 역할에 대해 찾아보면 좋을 것 같습니다.
- ex) Authentication, SecurityContextHolder, OncePerRequestFilter 등
- 처음 설계한 API와 ERD에 변경사항이 있었나요? 변경되었다면 어떤 점 때문일까요? 첫 설계의 중요성에 대해 생각해보세요.
- 설계 당시에는 다양한 연관관계를 모두 사용하도록 설계하였을 수 있습니다.
- 하지만 실제 개발할 땐 연관관계로 인해 N+1과 같은 이슈가 발생할 수 있습니다.
- 이에 대한 해결책은 Entity와 ERD 설계를 최대한 분리해서 생각하는 것 입니다.
- 또한 Entity는 최대한 단방향으로 구현하여 결합도를 낮추며, 사이드 이펙트를 방지하도록 합니다.
- 정답은 없지만, 개발하기 좋은 구조는 있습니다.
- 따라서 API, ERD 설계 등에 대해 검색해 보고, 일반적으로 어떤 부분까지 고려하는 것을 권하는지 찾아보면 좋을 것 같습니다.
- Refresh Token을 사용하는 이유가 뭘까요?
- AccessToken만으로 사용자를 판단하기에는 탈취 당했을 때의 취약점이 큽니다.
- 따라서 본 AccessToken의 만료 시간을 짧게 주어 주기적으로 사용자를 인증하도록 합니다.
- 추가적으로 이 AccessToken을 재발급 받기 위한 RefreshToken을 발급하고, 서버가 직접 관리하여 이중으로 보안합니다.
- 3번의 이유로 사용한다면, 왜 매번 Access Token과 Refresh Token을 모두 재발급 할까요? 만료 시간과 관련하여 고민/검색 해보세요!
- AccessToken 뿐만 아니라 RefreshToken도 매번 재발급한 이유는, 일반적으로 RefreshToken에 대한 탈취 취약점을 보완하기 위함 입니다.
- RefreshToken은 서버에서 관리하다 보니 탈취, 변형의 취약점이 낮지만 희박하더라도 탈취 당하였을 때의 영향도를 낮출 수 있겠죠?
- 관련하여 OAuth는 이러한 token들을 활용해 자사 사이트에 대한 접근 권한을 얻을 수 있게 합니다.
- 대표적으로 카카오 소셜 로그인이 있습니다.
- 앞으로 진행할 협업 프로젝트에서는 JWT 뿐만 아니라, OAuth2를 활용해 소셜 로그인도 구현해보면 좋겠습니다.
<더 나아가기>
내 프로젝트에 swagger 적용해보기
- swagger란? Open Api Specification(OAS)를 위한 프레임워크 입니다. API들이 가지고 있는 스펙(spec)을 명세, 관리할 수 있으며, 백엔드와 프론트엔드가 협업할 때 사용할 수 있습니다!