인프런 커뮤니티 질문&답변

Lego님의 프로필 이미지
Lego

작성한 질문수

스프링부트 시큐리티 & JWT 강의

스프링부트 시큐리티 27강 - jwt토큰 서버 구축 완료

Jwt 토큰 검증해서 정상적인 사용자인지 확인

해결된 질문

작성

·

846

·

수정됨

0

13분 정도에

 if (jwtHeader == null || !jwtHeader.startsWith("Bearer")) {
            chain.doFilter(request, response); // 다시 필터를 타게 하는 것이다.
            return;
        } 

위 코드를 작성하시는데 강의에서는 정상적인 사용자가 아닐 경우 다시 필터를 타게 한다고 하시는데


질문1. 다시 필터를 타게 하는 것이 아니라 로그아웃을 시키는 것이 정상적인 방법이지 않을까요? (이유는 다시 필터를 타도 이미 정상적인 사용자가 아닌데 다시 필터를 타게 할 이유가 없다고 생각합니다.)

 

질문2. 스스로 학습하다가 든 생각인데 클라이언트가 로그인 시도를 하면서 서버로 넘긴 데이터이니까 JwtAuthenticationFilter에서

ObjectMapper om = new ObjectMapper();
            User user = om.readValue(request.getInputStream(), User.class);
            System.out.println(user);

이렇게 entity 객체로 받는데 dto 객체로 받는 것이 안전하지 않은가요? (물론 강의에서 dto class를 만들지는 않았지만)

 

질문3. JwtAuthorizationFilter에서

Authentication authentication =         new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities());

SecurityContextHolder.getContext().setAuthentication(authentication);

강제로 authentication을 만들어서 security session영역에 authentication을 집어넣는 이유가 궁금합니다.

 

답변 2

1

  1. JWT필터에서 마지막에 UserDetails 객체를 리턴하기 때문에 중간에 필터를 나가게 되면 시큐리티 필터에서 걸러집니다.

  2. DTO로 받는 방법도 있습니다. 하지만 해당 강의의 대부분의 경우 Entity로 해결하는 방법으로 진행하였습니다.

  3. 기본 시큐리티로 로그인 처리를 하게 되면 시큐리티에서 내부 프로세스를 통해서 로그인 처리를 진행합니다.

    하지만 구현하려는 JWT 필터의 경우 기존 시큐리티 필터가 아닌 커스텀 필터이기 때문에 로그인 처리를 하는 로직이 필요합니다. 토큰 검증이 끝난 후 로그인 처리를 진행하는 부분입니다.

1

안녕하세요, 인프런 AI 인턴이에요.

  1. 이 필터에서 다시 필터를 타게 하는 것은, 정상적인 사용자가 아닌 경우에도 다음 필터로 넘어가서 처리가 되도록 하는 것입니다. 로그아웃을 시키지 않고 필터를 통과시키는 이유는, 로그인하지 않은 사용자도 일부 요청에 대해서는 필터 처리를 하지 않아도 되기 때문입니다. 다시 필터를 타게 하는 것이 아니라 로그아웃을 시키는 경우에는 모든 요청에 대해 로그아웃 처리가 되어버리기 때문에, 로그인하지 않은 사용자도 로그아웃 처리되어 버릴 수 있습니다.

  2. ObjectMapper를 사용하여 entity 객체로 받는 것과 dto 객체로 받는 것은 각각의 장단점이 있습니다. ObjectMapper를 사용하여 entity 객체로 받는 경우, 데이터 유효성 검사나 데이터 형 변환이 필요한 경우 추가적인 처리를 해주어야 합니다. 반면에, dto 객체로 받는 경우에는 이미 유효성 검사를 거친 데이터를 받기 때문에 데이터를 안전하게 처리할 수 있습니다. 하지만, 모든 요청에 대해 dto 객체를 사용하여 데이터를 받는 것은 번거로울 수 있습니다. 기능에 따라 적절한 방법을 선택하여 사용하시면 됩니다.

  3. JwtAuthorizationFilter에서의 Authentication 설정은 Spring Security의 인증 객체를 설정하는 부분입니다. UsernamePasswordAuthenticationToken은 사용자의 인증 정보와 권한 정보를 담고 있습니다. 따라서 principalDetails는 사용자의 정보를 담고 있는 UserDetails 객체이며, principalDetails.getAuthorities()는 사용자의 권한 정보를 담고 있습니다. 이렇게 설정된 Authentication 객체를 SecurityContextHolder에 저장하여 인증된 사용자 정보를 전역적으로 사용할 수 있도록 합니다.

추가로, Spring Security에 관련된 궁금한 점이나 다른 질문이 있으시면 언제든지 물어보세요. 도움이 되도록 최선을 다하겠습니다. 감사합니다.

Lego님의 프로필 이미지
Lego

작성한 질문수

질문하기