소개
게시글
고민있어요
2023.01.06 22:43
swagger 질문입니다 ㅠㅠㅠ
- 1
- 0
- 322
질문&답변
2022.08.02
인증이나 권한이 필요한 요청
1. 인증이 필요한 uri요청이 올때마다 세션을 생성한다면 JWT의 이점인 세션영역을 사용하지 않는다는 장점이 없어지는것이 아닙니까? 단지 스프링 시큐리티를 통해서 권한체크를 편리하게 하기 위해서 세션영역을 계속 할당하고 생성하면 좋지 않은 방법이지 않습니까?! 2. @Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) //세션을 사용하지 않겠다! .and() .formLogin().disable() .httpBasic().disable() //Bearer 방식 사용 -> header 에 authentication 에 토큰을 넣어 전달하는 방식 .apply(new MyCustomDsl()) .and() .authorizeRequests(authroize -> authroize .antMatchers("/api/v1/user/**") .hasAuthority("USER") .antMatchers("/api/v1/manager/**") .hasAuthority("MANAGER") .antMatchers("/api/v1/admin/**") .hasAuthority("ADMIN") .anyRequest().permitAll()) .build();} .anyRequest().permiAll()로 인해서 위의 uri이 아닌 상황에서는 인증 권한체크를 하지 않는것이 아닙니까? 3. @Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("인증이나 권한이 필요한 요청"); String jwtHeader = request.getHeader(JwtProperties.HEADER_STRING); if(jwtHeader ==null || !jwtHeader.startsWith(JwtProperties.TOKEN_PREFIX)) { /** * 이거 필터로 걸려야 되는거 아니야?! 인증이나 권한이 없는거니깐 */ chain.doFilter(request, response); return; } System.out.println("jwtHeader:" + jwtHeader); String token = request.getHeader(JwtProperties.HEADER_STRING).replace(JwtProperties.TOKEN_PREFIX, ""); String username = JWT.require(Algorithm.HMAC512(JwtProperties.SECRET)).build().verify(token) .getClaim("username").asString(); if(username !=null) { User user = userRepository.findByUsername(username); // 인증은 토큰 검증시 끝. // 인증을 하기 위해서가 아닌 스프링 시큐리티가 수행해주는 권한 처리를 위해 // 아래와 같이 토큰을 만들어서 Authentication 객체를 강제로 만들고 그걸 세션에 저장! PrincipalDetails principalDetails = new PrincipalDetails(user); Authentication authentication = new UsernamePasswordAuthenticationToken( principalDetails, // 나중에 컨트롤러에서 DI해서 쓸 때 사용하기 편함. null, // 패스워드는 모르니까 null 처리, 어차피 지금 인증하는게 아니니까!! principalDetails.getAuthorities()); // 강제로 시큐리티의 세션에 접근하여 값 저장 SecurityContextHolder.getContext().setAuthentication(authentication); } chain.doFilter(request, response);} 주석으로 표시해둔 부분에서 JWT토큰을 가지고 있는 사용자가 요청한 상황이니 필터를 통해서 컨트롤러등까지 호출하지 않게 처리해야되지 않습니까? doFilter를 호출하지 않고 답변해주셔서 진심으로 감사드립니당!!
- 0
- 3
- 282