250x250
Notice
Recent Posts
Recent Comments
관리 메뉴

탁월함은 어떻게 나오는가?

스프링부트에서 회원가입 할때 [Completed initialization in 1 ms] 까지 뜨고 먹통인 이유 본문

[Snow-ball]프로그래밍(컴퓨터)/프로그래밍 실수

스프링부트에서 회원가입 할때 [Completed initialization in 1 ms] 까지 뜨고 먹통인 이유

Snow-ball 2021. 7. 6. 22:30
반응형

스프링부트에서 포스트맨으로 회원가입을 위해서 정보를 보냈다.

 

하지만, 왠걸? 로딩이 되고 [Completed initialization in 1 ms] 까지 출력되고 더이상 진행이 되지 않았다.

 

해결방법 : 

 

해결 전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequiredArgsConstructor
public class SecurityFilter extends OncePerRequestFilter {
    private final SecurityProvider provider;
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = provider.resolveToken(request); 
        try {
            if (token != null && provider.validateToken(token)) { 
                Authentication auth = provider.getAuthentication(token);
                SecurityContextHolder.getContext().setAuthentication(auth);
            }
        } catch (SecurityRuntimeException e) {
            SecurityContextHolder.clearContext();
            response.sendError(e.getHttpStatus().value(), e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
cs

 

 

 

해결 후 : filterChain.doFilter(request, response); 을 빼먹은것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RequiredArgsConstructor
public class SecurityFilter extends OncePerRequestFilter {
    private final SecurityProvider provider;
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = provider.resolveToken(request); 
        try {
            if (token != null && provider.validateToken(token)) { 
                Authentication auth = provider.getAuthentication(token);
                SecurityContextHolder.getContext().setAuthentication(auth);
            }
        } catch (SecurityRuntimeException e) {
            SecurityContextHolder.clearContext();
            response.sendError(e.getHttpStatus().value(), e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
        filterChain.doFilter(request, response);
    }
}
cs

 

왜이런 일이 발생한것일까? 그걸 알기위해서는 Spring Security에 대해서 알고 있어야 했다.

 

Spring Security란?

서버에 URL을 통해 특정 리소스에 누군가가 접근할 때, 그 누군가가 해당 리소스에 대한 권한이 있는지 없는지를 판단하기 위한 과정이 필요하다. 

 

이러한 Authentication(인증) => Authorization(권한부여)의 과정을 스프링에서 Spring Security를 통해 사용하기 쉽게 제공해준다.

 

 

Spring Security 동작 방식

1. 클라이언트가 Resource에 URL을 통해 요청을 보낸다.

2. DlegatingFilterProxy는 요청을 가로채서 Spring Security Bean으로 보낸다.

3. Spring Security Bean은 인증 및 권한을 확인한다.

4. 권한이 잘 부여되어 있다면 리소스에 접근을 허용하고 그렇지 않다면 거부한다.

 

즉, 진행이 되지 않았던 이유는 Spring Security에 가져왔다가 chain 끊겨서 진행이 되지 않았던것이다!! 젠장!!

 

반응형
Comments