Spring Cloud Gateway, JWT 인증 인가 아키텍쳐 설계 - nhnacademy-be10-WannaB/wannab-wiki GitHub Wiki

요청 흐름별로 인증/인가 시나리오 상상

1. 인증이 필요없는 요청

회원가입, 로그인, Health Check 등

  1. 프론트 → Gateway
    • 프론트에서 토큰 없이 API 요청 ( POST /auth/users/login )
  2. Gateway 입장
    • 해당 경로는 인증을 통과하도록 설정해서 필터를 거치지 않도록 함
    • 바로 그냥 서비스를 찌르기
  3. Gateway → 특정 서비스
  4. 특정 서비스
    • 서비스 로직 수행
  5. 서비스 → Gateway
  6. Gateway → 프론트 → 사용자

2. 로그인된 사용자만 접근 가능한 요청 (인증 필요한 요청)

마이페이지 조회, 주문 내역 조회 등

  1. 프론트 → Gateway
    • 이미 로그인한 사용자는 쿠키에 담긴 jwt 값과 함께 http 요청을 보냄
  2. Gateway
    • Spring Cloud Gateway의 필터가 요청을 검증
      1. JWT가 존재하는가?
      2. 해당 JWT가 유효한가?
    • 이 경우 두가지 분기 처리
      1. 만약에 JWT가 없거나, 토큰이 손상, 만료되었다면 바로 그냥 401 Unauthorized 처리
      2. 토큰이 유효하다면, JWT를 파싱하여 user id를 획득하고 Header에 X-USER-ID를 붙임(다른 서비스에서 사용하기 편하라고 붙이는거 Role도 붙여도 ㄱㅊ을듯?)
  3. Gateway → 특정 서비스
    • X-USER-ID와 같은 헤더를 붙이면 다른 서비스에서는 비밀 키 값 같은것들을 몰라도 되니 편리함
    • 대신 이 경우에, 외부에 노출되지 않도록 보안 설정이 필요함
      • 보안설정 예시 : 외부로 포트를 노출시키지 않기 등
  4. 특정 서비스
    • X-USER-ID 헤더로 전달된 사용자 ID나 Role을 활용해서 로직 처리
  5. 서비스 → Gateway
  6. Gateway → 프론트 → 사용자

3. 관리자 권한이 필요한 요청 (인가가 필요한 요청)

관리자 페이지 조회 등

  1. 프론트 → Gateway
    • 위와 같음
  2. Gateway
    • JWT안에 Role 정보도 넣어서 gateway에서 검증을 처리해버리자
    • 만약 권한이 없다면 403 에러 응답
  3. Gateway → 특정 서비스
    • X-USER-ID 나 X-USER-ROLE 등의 헤더에 넣어서 주기
  4. 특정 서비스
    • 헤더 이용해서 로직 처리
  5. 특정 서비스 → Gateway
  6. Gateway → 프론트 → 사용자

왜 헤더에 값을 붙여서 보냄? JWT보내도 되는거아님? JWT를 각 서비스에서 파싱해도 되잖아

  • 사실 그래도 됨
  • 대신 그렇게 하면, 각 서비스가 JWT 서명 키값을 알고있어야함
    • 보안적으로 안전하다는 장점이 있음

그럼 헤더에 값을 파싱해서 gateway가 넣어주면 뭐가 좋은데?

  • 내부 통신 네트워크 오버헤드가 줄어듬
  • 각 서비스가 JWT에 대해서는 몰라도 됨
    • 어차피 gateway가 파싱해서 헤더에 넣어줄테니까
  • 대신 외부에서 API를 호출하도록 하면 안됨
    • 내부에서만 네트워크가 돌아야 보안상 안전함

추가 고민사항

0. 추가적인 사용자 정보가 필요하다면 netflix와 toss 처럼 passport 전략이 필요할수도? (추가 구현사항이니 나중에 시간나면)

1. AccessToken이 만료될 경우에는?

다시 로그인 → 토큰 재발급

만료가 아닌 기한없는 무제한 쿠키 → 문제점???

쿠키 → 시간 0, 창닫으면 알아서 사라지게 → 서버 발급만 해주고

토큰 만료 → 클라이언트에서 사라진다?, 서버에서 발급한 토큰의 기능이 상실된다?

2. RefreshToken 전략도 필요할듯?

3. WhiteList나 BlackList 방식의 보안 도입이 필요한가?

레퍼런스

[토스는 Gateway 이렇게 씁니다](https://toss.tech/article/22910)

[Spring Cloud Gateway를 이용한 서비스 라우팅 및 JWT 토큰 검증](https://zayson.tistory.com/entry/Spring-Cloud-Gateway%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%9D%BC%EC%9A%B0%ED%8C%85-%EB%B0%8F-JWT-%ED%86%A0%ED%81%B0-%EA%B2%80%EC%A6%9D)

[Spring Cloud Gateway JWT 인증, 인가 Filter 구현 및 적용](https://g-db.tistory.com/entry/Spring-Cloud-Gateway-JWT-%EC%9D%B8%EC%A6%9D-%EC%9D%B8%EA%B0%80-Filter-%EA%B5%AC%ED%98%84-%EB%B0%8F-%EC%A0%81%EC%9A%A9)

[[Spring Cloud] MSA : (3) 분산 환경에서의 인증 & 인가](https://sjh9708.tistory.com/122)