시큐리티에 UsernamePasswordAuthenticationFilter가 있는데,
필요한 기능 구현 과정
//JSON 형식으로 받았을 때 읽어오는 방법. -> @RequestBody와 같은 기능!
ObjectMapper om = new ObjectMapper();
Users user = om.readValue(request.getInputStream(), Users.class);
System.out.println(user);
Authentication authentication = authenticationManager.authenticate(authenticationToken);
PrincipalDetials principalDetials = (PrincipalDetials) authentication.getPrincipal();
System.out.println("로그인 완료됨: " + principalDetials.getUser().getUsername());
return authentication;
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
Authentication authResult) throws IOException, ServletException {
System.out.println("successfulAuthentication 실행됨: 로그인 및 인증이 완료되었다는 뜻");
PrincipalDetails principalDetails = (PrincipalDetails) authResult.getPrincipal();
// RSA가 아닌 Hash 암호 방식
String jwtToken = JWT.create()
.withSubject("토큰")
.withExpiresAt(new Date(System.currentTimeMillis() + JwtProperties.EXPIRATION_TIME))
.withClaim("id", principalDetails.getUser().getId())
.withClaim("username", principalDetails.getUser().getUsername())
.sign(Algorithm.HMAC512(JwtProperties.SECRET));
response.addHeader(JwtProperties.HEADER_STRING, JwtProperties.TOKEN_PREFIX + jwtToken);
}
request.getInputStream() : 바이트 단위로 읽어들임
request.getReader()
request.getParameter() / request.getParameterValues() / request.getParameterNames()
Spring Security (세션 방식)
JWT (Bearer 방식)
시큐리티가 filter를 가지고 있는데, 그 필터중에 BasicAuthenticationFilter 라는 것이 있다.
권한이나 인증이 필요한 특정 주소를 요청했을 경우 위 필터를 무조건 타게 되어있다.
- 만약에 권한이나 인증이 필요한 주소가 아니라면 이 필터를 타지 않는다.
- 라고 강의에서 공부했는데, 인증이나 권한이 필요하지 않은 곳에서도 해당 필터를 타게 된다. 스터디 팀원들과 공부해볼 부분.
따라서 JWTAuthorizationFilter에서 BasicAuthenticationFilter를 상속받는다.
필요한 기능 구현 과정
public JwtAuthorizationFilter(AuthenticationManager authenticationManager, UserRepository userRepository) {
super(authenticationManager);
this.userRepository = userRepository;
}
String username =
JWT.require(Algorithm.HMAC512(JwtProperties.SECRET)).build().verify(jwtToken).getClaim("username").asString();
Authentication authentication =
new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
리뷰
개발 과정
Order (주문) 테이블에서 음식과 수량을 같이 저장하는 방법 -> HasbMap을 사용했다. (@ElementCollection)
양방향 연관관계 설정 -> 이번 과제에선 대부분 일방향으로만 사용했다.
연관관계를 사용할 때 주의해야 할 부분은 아무래도 순서인 것 같다
API 명세 및 요구 사항은 위에 기입한 링크의 readMe.Md 파일에 올려두었다.