#2. 로그인 - 인증/인가 JWT 흐름

달래·2023년 12월 6일
0

개인프로젝트

목록 보기
2/6

로그인 서비스(인증/인가)의 설계를 다음과 같이 짜려고 한다.

  • 개인 DB를 이용하는 로그인
    - 일반 회원 로그인
    - 관리자 로그인
  • oauth 서버를 사용하는 로그인
    - kakao 로그인
    - google 로그인

이 때, 일반 회원과 관리자는 개인 DB를 사용하기 때문에 인증/인가에 대한 보안 전략이 필요하다.

💡인증
유저의 신원을 입증하는 과정이다.

💡인가
권한에 대한 허가로서, 인증된 사용자에 대한 자원 접근 권한을 확인한다.

여기에서 spring security를 적용하고, jwt를 사용하여 구현해보고자 한다.

JWT를 왜 사용하는가?🤔


1. JWT 사용 이전

HTTP는 stateless하다.
따라서 로그인을 한 번 거쳐 인증인가과정을 거쳤더라도, 이미 인증된 사용자인지 여부를 다른 api 요청에서 알아낼 수가 없다.

이를 위해서 세션과 쿠키를 이용하여 사용자의 정보를 저장해 둔다. 흐름은 다음과 같다.

📈흐름

  1. [FE] 사용자 정보(id, password)를 담아 로그인 api를 요청한다.
  2. [BE] 받은 사용자 정보로 인증과 인가 작업을 거치고, 유효하다면 세션ID를 생성해 세션에 저장한다.
    이 후 세션ID를 헤더에 cookie로 저장하여 응답한다.
  3. [FE] 모든 api를 요청할 때 응답헤더에서 받은 세션ID를 요청 헤더에 넣어준다.
  4. [BE] 요청 헤더의 세션ID를 저장소와 비교하여 일치하면 api를 호출한다.

하지만, 이 방법에는 단점이 있다.
서버에서 세션ID를 관리하기 때문에, 확장성에 문제점(여러대의 서버일 경우 모든 서버의 세션을 모아주는 세션 스토리지를 사용해야 하는 등)이 생긴다.

2. JWT

이로 인해서 Token을 사용하여, 인증을 정보의 흐름에 맡기는 방법이 제안되었다!
이 Token으로 주로 사용하는 것이 바로 JWT, Json Web Token이다.

JWT는 백엔드에서 설정한 시크릿키를 사용하여 JWT를 발급하고, 마찬가지로 시크릿키를 사용해서 인증과정을 거친다.

보통 access token만으로 처리하기도 하는데, 나는 access token과 refresh token을 사용하여 인증/인가를 처리하기로 하였다.

access token

  • 접근권한과 관련된 토큰
  • 이 토큰으로 유효성을 검증하면 인증처리
  • 서버에 저장되지 않음
  • 유효시간 짧음 (30분 ~ 1시간 정도) (탈취되어도 괜찮게끔)

refresh token

  • 접근권한과 관련 없고 aceess token 재발급 용도
  • 로그인 성공 시 발급되고, 이후 저장소에 저장되어 관리
  • 로그아웃 시 저장소에서 삭제
  • 자동로그인/로그인 유지 -> 유효시간 김 (3일 ~ 30일)

📈흐름

  1. [FE] 사용자 정보(id, password)로 로그인 api를 요청한다.
  2. [BE] id와 password를 검증(인증)하고, access token과 refresh token, access token 만료시간을 반환한다. 이 때, refresh token은 DB에 저장(id, refresh token)한다.
  3. [FE] 반환받은 access token을 매 api 호출마다 헤더에 붙여 전송한다.
  4. [BE] api 호출시 access token을 확인하고 유효성을 체크하고 api를 동작한다.
  5. [FE] access token이 만료기간이 지나거나 30초 미만일 때, 백엔드로 refresh token을 붙여 reissue 요청을 보낸다.
  6. [BE] reissue 요청이 들어온 경우, refresh token이 db에 있는지 확인한 후 맞다면 access token과 access token 만료시간을 반환한다.
  7. [FE] 반환된 access token과 만료시간을 저장하여 다음 api 호출에 사용한다.

세션과 비슷한 방법으로 보일 수 있지만, 서버의 부하와 확장과 관계없이 같은 방법으로 인증/인가가 진행되어서, 확장성에 대하여 이점이 있다.


이를 적용하여 프로젝트의 인증/인가 로직을 작성하려고 한다!
이러한 이해없이 막무가내로 jwt를 구현하려고 하다보니 많이 헤매게 되었다..ㅎㅎ

profile
아좌잣~!

0개의 댓글