안드로이드에서 jwt 사용해보기

HR·2022년 5월 7일
0

! retrofit 이외의 서버와의 통신 방법

AsyncTask (Deprecated)
okhttp
volley


server는 node.js로 작업하였다
실제 사용 코드는 추후에 추가 예정

통신 과정

  1. 사용자가 로그인

  2. 앱에서 서버에 아이디, 비밀번호를 보냄

  3. 서버에서 받은 값들을 db에 있는 값들과 비교

  4. 서버가 id, 권한과 함께 jwt 토큰을 생성 후 앱에 리턴 (json 형식으로)

    //토큰에 포함된 정보들

    1. access_token
    2. token_type : "bearer"
    3. expires_in : 3000 //3000초 후 만료
  5. 앱은 저장된 jwt를 사용해 http 인증 헤더를 만들고, api 요청을 보내 사용자를 인증


AccessToken과 RefreshToken값의 원리

  • AccessToken은 보안에 취약하다.
  • 따라서 AccessToken의 유효기간을 짧게 하고, 유효기간이 긴 RefreshToken을 같이 발급해 준다.
  • RefreshToken의 유효기간 내에는 AccessToken을 새롭게 발급받을 수 있다.
  • RefreshToken의 기간이 만료되면 다시 로그인 해야 한다.
  1. 사용자의 로그인, 앱에서 서버에 id와 pw를 전송

  2. 서버는 받은 값들을 DB에 암호화되어 저장된 값들과 비교

  3. 로그인이 완료되면 AccessToken과 RefreshToken을 발급해줌, 서버 DB에는 RefreshToken 값을 저장해 놓음

  4. 앱에서는 토큰들을 저장하고, 인증을 위해 AccessToken을 서버에 보냄

일반적인 경우

  1. 서버는 AccessToken을 검증하고, 이에 맞는 데이터를 보냄

만약 AccessToken이 만료된 경우

  1. AccessToken이 만료된 경우에는 헤더에 실어 요청을 보내도 권한이 없어짐

    클라이언트도 처음에 발급될 때 expire time을 같이 받으므로, 굳이 서버에 보내기 전에도 클라이언트가 만료여부를 확인하고 바로 재발급 요청을 할 수도 있다.

  2. 클라이언트에서 RefreshToken과 AccessToken을 같이 서버에 보냄

    토큰들을 보낼 때는 헤더에 추가해서 보내야 한다.
    interceptor, accountmanager 등을 이용할 수 있다.

  3. AccessToken을 검증하고(만료됨), 받은 RefreshToken과 서버에 저장된 값을 비교

  4. 해당 RefreshToken이 존재한다면 새로운 AccessToken을 발급함
    8-1. 만약 RefreshToken까지 만료되었다면, 재로그인을 요청한다.

  5. 새로 발급된 AccessToken을 클라이언트에 쏴줌


안드로이드에서 키 값 관리

안드로이드에서 토큰 값을 관리하기 위해서 사용하는 다양한 방법이 있지만, 나는 기기 내부에 토큰 값들을 저장하는 SharedPreference를 이용한다.

SharedPreference란?
DB에 데이터들을 저장해야 할 경우에,
DB에 데이터들을 저장하는 것이 아닌
앱 폴더 내에 데이터들을 저장하는것

cf) 이외의 방법
AccountManager

  • 토큰 값을 헤더에 추가해서 보내주기 위해 Interceptor를 사용한다.
    cf) 이외의 방법
    @Header 어노테이션

0개의 댓글