이전 글에서 Refresh Token 관리에 대해 설명했는데, 우선 구현하기 쉽다고 생각되는 DB에 저장하는 방식에 대해 알아보았습니다. 방법은 여러 가지가 있었는데 2가지를 골라서 비교해 보았습니다.
1. 별도의 Refresh Tokens 테이블 사용
먼저 이 방법은 Refresh Tokens 라는 테이블을 만들어서 토큰을 관리하는 방식입니다. 테이블을 살펴보면
id | INTEGER (PK) | 테이블의 고유 id |
user_id | INTEGER (FK) | 유저의 id |
refresh_token | VARCHAR | refresh token 값 |
created_at | TIMESTAMP | Token이 만들어진 시간 |
expires_at | TIMESTAMP | Token이 만료되는 시간 |
위와 같은 구조의 테이블을 사용해서 토큰을 관리하는 방식입니다. 토큰 관리 순서에 대해 나타내보면
로그인 시 토큰 관리
- 로그인 요청 처리 : 로그인에 성공하면 access 토큰과 refresh 토큰을 생성합니다.
- 토큰 저장 : 생성된 refresh 토큰을 테이블에 저장합니다.(이때 기존 토큰이 있는 경우 무효화하거나 삭제할 수 있습니다.)
- 응답 반환 : 클라이언트에게 access 토큰을 반환합니다.
로그아웃 시 토큰 관리
- 로그아웃 요청 처리 : 사용자가 로그아웃을 요청하면 클라이언트가 access 토큰을 서버로 전송합니다.
- 토큰 삭제 : access 토큰을 통해 유저의 Id를 파악하고 해당 유저의 refresh 토큰을 찾아 삭제합니다.
2. 세션 테이블을 사용해서 관리
이 방식은 Sessions 테이블을 만들어서 토큰을 관리하는 방식입니다.
id | INTEGER (PK) | 테이블의 고유 id |
user_id | INTEGER (FK) | 유저의 id |
refresh_token | VARCHAR | refresh token 값 |
ip_address | VARCHAR | 현재 유저의 IP 주소 |
user_agent | VARCHAR | 유저의 클라이언트 서프트웨어와 운영 체제에 대한 정보 |
created_at | TIMESTAMP | Token이 만들어진 시간 |
expires_at | TIMESTAMP | Token이 만료되는 시간 |
위의 방법과 비교해서 ip 주소와 user_agent 값이 추가된 것을 볼 수 있습니다. 그리고 로그인, 로그아웃시 토큰이 처리되는 방식이 조금 다릅니다.
로그인 시 토큰 관리
- 로그인 요청 처리 : 사용자가 로그인하면 검증해서 access 토큰과 refresh 토큰을 생성
- 세션 생성 : 새로운 세션을 생성하고, sessions 테이블에 세션 정보를 저장
- 토큰 저장 : 생성된 refresh 토큰을 sessions 테이블에 저장
- 응답 반환 : 클라이언트에게 access 토큰을 반환
로그아웃 시 토큰 관리
- 로그아웃 요청 처리 : 사용자가 로그아웃 요청하면 클라이언트가 access 토큰을 서버로 전송
- 세션 무효화 : sessions 테이블에서 access 토큰으로 얻은 유저 id를 통해 해당 refresh 토큰을 삭제하거나, 세션 상태를 무효화
세션을 무효화 하는 경우에도 두 가지 방식이 있는데 세션 테이블에 active 열을 만들어서 True, False 값으로 유효성을 검사하는 방법과 1과 같은 방식으로 세션을 삭제하는 방식이 있습니다.
후기
위의 큰 두가지 방법 모두 공통적인 부분이 있어서 저는 active열을 만들지 않고 행을 삭제하는 방식으로 개발을 진행해 볼까 합니다. Fastapi에는 유효 시간을 지정하는 기능이 들어있지만 expires_at을 사용해서 한번 더 검증해 줌으로 더욱 안정적인 서버가 될 수 있을 거라 생각해서 생성, 만료시간도 포함해서 ERD를 구성하려고 합니다. 처음 해보는 토큰 관리이다 보니 고려할 것도 많고 보안과 직결되는 내용이라 추가적인 공부가 필요할 것 같습니다.
'프로그래밍' 카테고리의 다른 글
[프로그래밍] else 문을 지양하는 이유 (1) | 2024.10.08 |
---|---|
[프로그래밍] 객체지향 프로그래밍(OOP)이란? (0) | 2024.09.26 |
[프로그래밍] JWT - Refresh Token 관리에 대해 (2) | 2024.08.07 |
[프로그래밍] ERD 1 - Cardinality (1) | 2024.08.06 |
[프로그래밍] API 명세서 1 - 상태코드, 메서드 (2) | 2024.08.04 |