[TIL] 삼성 시그니처: 인증/인가는 어디에 구현해야할까?
ISSUE 1. 시큐리티는 어디에 걸어야할까
❓문제상황
- MSA환경에서 인증/인가를 처리할 곳을 정해야했다.
- 우리서비스의 경우, OAuth는 사용하지않고 JWT를 활용한 서비스 자체의 로그인으로 인증을 진행하려한다.
- 그렇다면 모든 API가 들어오는
Api Gateway
에 인증절차를 두어야할까 아니면 유저의 정보를 다루는Member service
에 두어야할까 고민이 되었다.
❗해결방법
1. Security란 무엇인가?
- Spring MVC와 관계없이 Filter로 인증/인가를 체크할 수 있는 프레임워크이다.
- 인증객체(UserDetail)를 생성하여 백엔드 서버 내에서 인증된 유저임을 보장해준다.
- 우리 서비스의 경우에 UserDetail을 사용하려면 모든 서비스에 security를 dependency해야한다.
- 인증/인가는 api gateway에서만 진행되는데 중복적으로 filter를 타는게 맞을까..?
2. Api Gateway에 security달기
- Api Gateway는 리버스 프록시 역할을 할뿐 Web server가 아니다.
- jwt token발급을 api gateway에서 진행시 api gateway가 jwt토큰을 생성하고 유저 정보를 조회하기 위해서는 db에 접근해야한다.
- Api Gateway에는 JWT토큰이 유효한지 확인하는 필터를 추가하여 인증/인가에대한 역할만 수행하도록 하려고한다.
3. Member Service에 security달기
- Member service의 메소드
- 회원가입 → token없음
- 로그인 → token 없음, jwt만듦
- 로그아웃 → token 있음, jwt해제
- refresh token 재발급 → token있음, jwt새로만듦
- 위와같은 로직밖에 없다면 굳이 security를 달 이유가 있을까?
- api인증/인가에 경우에는 apigateway에서 판단하게된다. member service에 도달하기전 api gateway에서 확인 후 member service에보내기 때문에 filter를 탈 이유가 없다.
- 그렇다면 member service는 jwt토큰을 생성하고 해제하는 역할만 하면 된다.
4. 결론
- Api Gateway : filter추가
- jwt token 유효한지 체크 Filter
- 유효하다면 request api에 Http head에 memberId추가하여 보내기
- 유효하지 않으면 401
- Member service : jwt token 생성역할
- 로그인, refresh token 재발급
- jwt provider로 access token, refresh token 생성하여 클라이언트에게 전달
- 로그아웃
- black list를 사용하여 refresh token 탈취 방지
- 로그인, refresh token 재발급
☝ security의 필터들을 분해하여 각각의 서비스에 적용하는 식으로 구현예정
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.