• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

JWT 질문

21.03.22 17:47 작성 조회수 268

1

안녕하세요.

JWT 강의를 듣고 이것저것 찾아보는 중 궁금점이 하나 생겼습니다.

강의 해 주신 내용을 보고 일단 제가 이해한 내용은 로그인을 하면 해당 유저에 해당하는 권한들을 JWT payload에 auth 라는 claim으로 실어서 보낸다음, 요청시마다 payload에 실려있는 권한들을 따로 정의한 필터를 통해 확인하는 것이 맞나요?

그러면 매 접근마다 DB를 통해서 해당 사용자의 권한이 무엇인지 조회할 필요가 없어서 좋을 것 같다고 느꼇습니다.

여기서 몇 가지 질문입니다.

1. 만약 로그인이 되어있는 도중, 어떠한 조건이나 관리자에 의해 서버에서 권한이 변경된 경우에는 토큰에 해당 정보를 반영하지 못하게 되는데, 그러면 로그인을 다시해서 권한정보들을 다시 담을 수 밖에 없는건가요? (로그아웃 후 로그인을 다시 하지 않는이상 기존 권한에 대한 접근이 허용되므로 서버측 의도와는 다르게 동작할 수 있을 것 같음) 그리고, 토큰자체에 권한정보가 대놓고 들어있어서 문제가 될 것 같기도 합니다.

2. 강의에선 사용자의 이름을 담으셨는데, 이름이나 메일 말고 DB에 저장된 기본키(순서번호 또는 UUID)를 담아서 사용해도 문제가 없으려나요???

3. 1번의 문제점을 없애려면  일단 jwt에 권한정보를 넣지 말고, 사용자에 대한 고유정보(email이나 id값 등)만 담은 뒤,  토큰이 있기만 하면 일단 요청을 받고나서 각 서비스쪽에서 DB에서 권한을 조회한다면 1번문제점은 사라질탠데, 이러면 결국 요청마다 DB를 검사해야 한다는 단점이 있겠죠? -> 실제 현업에서도 토큰에 고유ID와 권한정보도 말아넣어서 권한에 대한 DB조회를 최소화하는지 궁금합니다.

4. SecurityContextHolder 라는것을 코드에서 쓰셨는데, 찾아보니 세션처럼 메모리상에 있는 것이더라구요.
그럼 세션처럼 들어온 토큰에 대한 사용자정보가 저장되는건가요?(한 요청에 대해서만 살아있는 컨텍스트인지, 세션처럼 유지되는 요청 토큰에 대해 매핑되서 유지가 되는지)
세션처럼 유지된다면 Context 홀더를 쓰면 3번 방법처럼 토큰에 권한정보를 담지 않아도 토큰을 보고 정상 토큰이면 일단 필터를 거친 후, 컨트롤러나 서비스에서 이미 컨텍스트에 있는 토큰에 대한 사용자정보를 쓰는게 가능하겠네요? (최초요청 시 컨텍스트의 인증정보 내에 DB의 사용자 정보(권한 등)를 조회해서 넣어 놓았고, 세션처럼 토큰에 대한 컨텍스트가 유지된다는 가정)

답변 2

·

답변을 작성해보세요.

3

1. 해당 상황은 JWT 를 적용하는 시스템에서는 당연히 고민해야하는 포인트일 것 인데요. 해결 방법에는 정말 많은 방법들이 있을거라 생각합니다.

간단하게 예를 들자면 아래와 같은 방법들이 있을 것 같네요.  

 - 권한 DB의 Version 정보를 관리해서 권한이 수정되면 Version을 변경하고 JWT 내의 Version 정보와 비교해서 틀리면 Update 
 - JWT 만료 날짜를 짧게 유지한다.

 - 토큰을 Redis 혹은 DB 같은곳에 저장해놓고 권한이 변경되면 해당 토큰을 업데이트 대상 토큰으로 저장하여 놓고 권한이 필요한 API를 요청할 시 업데이트 대상 토큰을 검증하는 필터를 구현하여 업데이트

 - JWT 페이로드에 발급 시간을 저장해 놓고 권한이 변경된 시간과 비교 업데이트 

간단하게 작성했지만 실제로 구현 시 어떤 Data Store를 쓸지 어떤 프로세스로 구성을 할지 수많은 형태가 나올 수 있을 듯 합니다. 추가로 Stateless에 대한 부분도 고려도 하면 좋을 것 같습니다.

2. 넵 문제는 없습니다. 다만 시스템 상 유출되면 안되는 중요 Key의 경우는 안담는게 좋을 것 같습니다. 

3. 현업에서도 권한에 대한 부분을 JWT에 담을 때도 있습니다. 하지만 보안 상 Data Store에 권한 정보를 담아야 한다면 많은 호출이 예상되기 때문에 일반적인 DB를 이용하는 것 보다는 Redis와 같은 녀석들을 이용하는 것이 더욱 효율적일 것이라고 생각됩니다.

4. JwtFilter > doFilter 부분을 보시면 Request가 들어올때 마다 토큰이 정상이라면 인증정보를 저장하는 부분이 있습니다. 참고하시면 좋을 것 같습니다. 

질문 주셔서 감사합니다. 또 궁금하신 것 있으시면 언제든지 질문주세요 :)

0

답변 감사합니다!!