1. 개요
회원의 로그인 기능을 구현하려고 하다보니 자연스럽게 JWT토큰에 대해 알게 되었고, 대부분의 웹 서비스는 이 JWT토큰를 사용해서 로그인과 로그인 상태를 유지하고 있었습니다.
이러한 기능을 구현하기 위해서는 JWT토큰에 대한 이해와 로그인 서비스에 대한 이해가 필요합니다.
2. 인증(Authentication)과 인가(Authorization)
로그인 서비스에 대해 알아보기 전에 먼저 인증과 인가에 대한 차이를 알아야 합니다.
인증(Authentication): 대표적인 로그인 기능입니다. 아이디와 패스워드 등을 통해 특정 서비스에 일정 권한이 주어진 사용자임을 인증받는 서비스입니다.
인가(Authorization): 사용자가 한 번 인증을 받은 후에, 해당 특정 서비스를 이용할 수 있는 지에 대한 여부를 결정하는 서비스.
여기서 인증은 로그인 버튼을 눌렀을때 로그인이 되는 것을 말하고, 인가는 로그인 상태가 쭉 유지 되며 마이페이지와 같은 로그인을 하고 나서 이용할 수 있는 서비스를 검증하는 것을 말합니다.
이러한 인증과 인가 기능을 구현하기 위해서 사용되는 것이 바로 JWT 토큰입니다.
JWT토큰이 사용되기 전에는 세션을 이용해서 인가 기능을 구현했었습니다.
세션과 JWT토큰의 차이는 아래와 같습니다.
세션: 로그인 정보를 서버가 가지고 있음(데이터 베이스 등)
JWT토큰: 로그인 정보를 사용자가 가지고 있음(쿠키)
세션을 이용한 방법은 서버에 저장되어 있기 때문에 메모리 부족의 원인이 되고, 서버가 재부팅이 될 경우 사용자의 로그인 상태가 모두 해제가 되는 단점이 있어, 이런 단점을 보완하기 위해 JWT토큰을 사용합니다.
프로세스
1. HTTP /Login 엔드포인트로 username과 password를 담아 Request
2. 서버 측에서 서버에서 지정한 secret key 기반으로 jwt 토큰을 생성
3. jwt토큰을 browser로 Response(쿠키에 저장해서)
위까지가 로그인 프로세스이고,
4. 이후 서버에 요청할 때 JWT토큰을 포함해서 같이 Request합니다.
5. 서버는 JWT Signature를 체크한 후 JWT payload에 담긴 유저의 정보를 확인합니다.
6. 유저의 정보와 함께 Request를 처리하고 Response합니다.
3. JWT 토큰
JWT토큰은 JSON 데이터 구조를 사용하는 서명 표준으로 RFC7515라고 하며 헤더, 페이로드, 서명의 3가지 부분으로 구성됩니다.
Header: 토큰의 타입과 해시 암호화 알고리즘으로 구성되며 토큰의 유형(JWT)과 HMAC, SHA256과 같은 해시 알고리즘을 나타냅니다
Payload: 토큰에 담을 정보를 포함합니다. json과 같이 name : value의 쌍으로 구성됩니다
Signature: secret key와 같은 서명 정보를 포함합니다.
위의 사이트에서 JWT 토큰을 Encoding하고 Decoding하는 것으로 테스트할 수 있습니다.
4. Access Token, Refresh Token
JWT_ACCESS_TOKEN_SECRET=AccessTokenSecretTest
JWT_ACCESS_TOKEN_EXPIRATION_TIME=10
JWT_REFRESH_TOKEN_SECRET=RefreshTokenSecretTest
JWT_REFRESH_TOKEN_EXPIRATION_TIME=604800
또한 이러한 JWT토큰은 서버측에서 Access Token과 Refresh Token 2개를 사용해서 관리합니다.
JWT은 위와 같이 Expiration time을 가지도록 하여 수명을 관리합니다. 특정 시간이 지나면 토큰이 만료되도록 하여 자동적으로 로그인 상태를 해제시키는 것이지요.
보통은 Access Token의 수명이 짧고 Refresh Token의 수명이 깁니다.
Access Token: 실제로 유저의 정보가 담긴 토큰으로, 서버에서 Request가 올 때 이 토큰에 있는 정보를 활용하여 사용자의 정보의 맞게 Response를 합니다.
Refresh Token: 새로운 Access Token을 발급해주기 위해 사용하는 토큰으로 짧은 수명을 가지는 Access Token에게 새로운 토큰을 발급해주기 위해 사용됩니다. 이 토큰은 보통 Database에 같이 유저 정보와 같이 기록합니다.
실제로 jwt토큰을 사용한 로그인 서비스를 구현하는 예제는 어떤 백엔드를 쓰느냐(spring, express, django 등)에 따라 달라서 따로 찾아보는 것이 좋은데, nest.js로 구현된 로그인 서비스는 아래 블로그를 참고하시면 됩니다.
https://velog.io/@algo2000/pj01-05
참고
https://velog.io/@syoung125/JWT-%ED%86%A0%ED%81%B0%EC%9D%B4%EB%9E%80
'Backend&Devops > 기타' 카테고리의 다른 글
[Git] 변경된 내용 삭제(git reset) (0) | 2022.07.26 |
---|