파이리v
103
2019-06-11 11:48:37
6
397

JWT 인증 로직 질문입니다.


안녕하세요.


이번에 API 서버와 프론트엔드 서버를 분리해서 프로젝트를 진행하고 있습니다.


API 서버 호출 시 인증은 JWT를 이용해서 구현을 했습니다.


지금은 access token을 발급해주고 cookie에 저장 후 매 요청마다 헤더에 담아 서버로 보내고 있습니다.


jwt의 보안적 측면을 고려하면 refresh token의 사용을 피할 수 없을것 같아서 구현을 해보려고 하는데 고민이 많네요..


일단 refresh token의 경우는 클라이언트에 저장하지 않고(보안이 중요하기 때문) 서버측에 저장을 해놓아야 안전하기도 하고 강제로 파기시킬 수도 있다고 하더군요. 최대한 DB 접근을 피하고 싶지만 어쩔수가...ㅠ_ㅠ


제가 생각해본 로직은 다음과 같습니다.


1. 최초 로그인 시 액세스토큰, 갱신토큰을 같이 발급한 후 갱신토큰은 DB에 저장을 해 놓고 액세스토큰만 클라이언트로 보낸다.

2. 클라이언트는 발급받은 액세스토큰을 쿠키에 저장해놓고 매 요청마다 헤더에 담아 서버로 보낸다.

3. 서버에서는 액세스토큰을 인증하고 정상적이라면 요청된 리소스를 클라이언트에게 제공해준다.

3-1. 서버에서 액세스토큰을 인증을 하는데 만료된 토큰이라면 http 401 token expired 응답을 전송한다.

3-2. 401 응답을 받은 클라이언트는 /api/auth/refresh 를 호출해서 새로운 액세스토큰 발급을 요청한다. (이때 jwt claim에 담겨있는 회원번호와 회원아이디를 같이 전송할려고 합니다.)

3-3. 서버는 전달받은 회원번호와 회원아이디를 가지고 DB를 조회해서 갱신토큰을 가져오고 갱신토큰을 인증 후 만료되지 않았다면 새로운 액세스토큰을 발급 후 응답을 한다.


위와같은 로직이 그려지는데..


다른분들은 어떤 방식으로 jwt 인증을 구현하셨나요?


이러한 인증방식을 처음 도입하려다보니 많이 고민이 되네요.. 감사합니다!

0
1
  • 답변 6

  • 익명[0]
    249
    2019-06-11 12:00:18

    저는 3번에서 바로 응답처리하지 않고 만료됬다면

    회원아이디 통해서 DB의 refreshToken으로 재발급하고 응답해주었습니다.

    refreshToken까지 만료된 상태면 로그인 상태 해제하고 로그인화면으로 리다이렉트 하는걸로 구현하였습니다.


    token 발급 관련해서는 하기 나름인것 같아요.

    누가 정답이고 오답이라고 할것도 없는거 같습니다.

    말씀하신대로 구현하셔도 문제 될것이 없어보여요

    0
  • lovestory
    512
    2019-06-11 12:05:38

    저희 같은 경우(백엔드 : spring boot rest api 프론트 엔드 : vue)는

    1. 로그인시 클라이언트에 access token 뿐만 아니라 refresh 토큰도 주고

    2. 받은 정보를 vue storage에 담는다.(물론 DB에도 저장을 하겠지만 매번 DB 연결하는게 부담이 되겠죠?)

    3. 일정 기간 expire 기간이 지나면 vue storage에 담았던 refresh token으로 다시 access token을 발급 받는다.

    4.  다시 새로 받는 access token으로 해당 API 호출한다.


    도움이 되실까 모르겠네요 ㅠ,ㅠ 


    0
  • 파이리v
    103
    2019-06-11 12:54:48

    Skooma 

    처음엔 저도 만료 시 응답하지 않고 바로 갱신토큰 조회 후 새 액세스토큰 발급도 생각해봤었는데

    그렇게 구현해도 상관이 없군요!

    딱히 정해진 정답이 없다니 생각한 방향대로 구현을 해봐야겠네요ㅎㅎ 감사합니다.

    0
  • 파이리v
    103
    2019-06-11 12:56:02

    lovestory

    토큰을 vue storage에 담는 방법도 있군요. 이번에 저도 프론트는 vue.js(nuxt.js)로 진행을 하는데

    이 방법도 한번 고려를 해보겠습니다.

    감사합니다!


    0
  • 이리나이
    1k
    2019-06-11 13:08:35

    저는 리프레쉬 토큰시 엑세스 토큰과 같이 보냅니다. 그래서 마지막 토큰인지도 체크하죠.

    0
  • 파이리v
    103
    2019-06-11 13:17:35

    이리나이

    아하 정말 다양한 방법으로 구현이 되는군요..

    참고하겠습니다. 감사합니다!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.