인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

장원익님의 프로필 이미지

작성한 질문수

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

인증과 인가에 대해서 질문이 있습니다.

작성

·

715

0

안녕하세요 강사님!

항상 진심을 다해서 모든 질문을 답변해주시는 강사님에게 정말 감사하다고 먼저 이야기 드리고싶습니다.

오늘 제가 질문할 내용은 바로 MSA에서의 인증과 인가입니다.

Gateway-Service, User-Service, Order-Service 가 있다고 했을 때, 강의의 내용과 동일하게 토큰을 발급하는 서버는 User-Service가 수행한다고 가정하면 각각 Service들은 권한에 대한 처리는 어떻게 해야할까요?

제가 생각한 방법은 2가지 입니다.

1. Gateway 에서 최초 요청이 들어올 때, 토큰에 포함된 ID를 토대로 User-Service에 해당 ID가 가지고 있는 권한을 가져오도록 Request 합니다.

그리고 JWT payload에 권한에 대한 정보를 추가하고 relay 합니다.

권한에 대한 인증이 필요한 서비스에서는 해당 토큰만 파싱하여 권한이 있는지 없는지 확인합니다.

2. (권한이 필요한)Order-Service에 Client의 요청이 갔을 때, Order-Service는 요청이 들어온 토큰을 파싱하여 UserId를 확인합니다.

그리고 User-Service 에 해당 UserId가 가지고있는 권한을 가져오도록 Request 합니다.

권한이 있다면 로직을 계속하고 없다면 Reject 합니다.

이 두 방법 모두 매번 요청이 들어오면 User-Service에 권한을 가져오도록 하는 요청이 필수적이라는 단점이 있어 좋은 방법은 아니라고 생각하는데, 강사님이시라면 어떻게 하실까 궁금하여 질문 올립니다.

추가적으로 위의 방법대로 한다면 Spring Security는 User-Service에만 달리면 되는건가요? 아니면 각각 서비스 모두에게 Security가 달려야 할까요?

답변 1

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다. 

JWT 관련 내용은 말씀하셨던 것처럼 처리하는 것도 가능합니다. 일반적인 OAuth  서비스를 사용할 때는 인증 후 권한이 포함된 Token을 Client에 보관하거나 Request Header에 저장하여 다른 쪽 서비스로 전달하고 있습니다. 강의에서 사용한 user-service의 역할을 인증 서비스라는 이름으로 따로 구현하는 것이 좋다고 생각되며, 해당 Token에는 만료 시간 및 제한할 수 있는 정보를 같이 포함하고 있습니다. Token은 지속적으로 사용된다기 보다는 서버에 요청을 보낼때 (또는 서비스를 사용중이라도 주기적으로) 가지고 있는 Token의 계속 사용할 수 있는 확인하고 있으며, 필요시에 Refresh Token을 다시 요청하기도 합니다. 우리가 스마튼 폰에서 인증이 필요한 서비스 (카카오톡이나 구글 ...)를 사용할 때, 한번 로그인 후 지속적으로 사용할 수 이유가 비슷합니다. 만약 해당 서비스에서 비밀번호를 변경했을 때, 바로 접속정보가 차단되는 것이 아니라, 일정한 시간이 지난 후에 차단되거나 다시 인증을 요청하게 됩니다. 

JWT 토큰의 정보만 확인할 거라면 다른 서비스(order-service)에서는 spring-security가 필요 없을 수도 있지만, user-service로 정보를 보내는 것과 비슷하게 spring-security의 인증/권한 확인을 하는 경우라면 spring-security를 유지합니다. 

답변이 되셨기를 바라며, 추가 질문 사항 있으시면 다시 글 남겨 주세요.

감사합니다.