Session & JWT & Oauth2.0 & RefreshToken

ollie·2023년 12월 10일
0

Authentication

목록 보기
2/3

배경 🐈

인증을 구현하게 되면서 전반의 인증 방법에 대해 공부하였는데, 이제야 올립니다...

기본 인증 방식

📍 Session

  • 서버가 클라이언트에서 Session을 만들어서 보내면 서버가 Session을 보냈다는 사실을 저장 ⭕
  • 만약 세션이 탈취되었다면? 서버는 적어놓은 세션 정보를 삭제하면, 다음에 그 세션 들고 악의적인 사용자가 요청을 보낼 때 해당 요청이 걸러집니다.
  • 그렇지만 이렇게 서버에게 모든 세션 정보를 적어놓는 건 상당한 데이터 부하가 발생합니다.
  • 세션 정보를 가지고 있는 서버만이 인가도 처리할 수 있어 역할의 분리가 안되면서 상당한 부하가 발생합니다. (인증과 인가를 반드시 한곳에서 처리❗)

📍 JWT

  • 서버가 클라이언트에 JWT를 만들어 보낼 때 그에 대한 정보를 서버 어느 곳에도 저장 ❌
  • 만약 JWT가 탈취되었다면? 서버에 기록해놓은 게 없기 때문에 탈취된 JWT가 어떤건지 몰라서 JWT 만료일까지 악의적인 사용자의 이용을 막을 수 없습니다.
  • 다른 서버에게 secret key를 나눠주면 인가에 대한 처리를 할 수 있기 때문에 인증과 인가에 대한 역할 분리가 가능합니다. 그렇기 때문에 서버에 무리가 가지 않고 부하 우려도 적습니다.
    • 이 특징은 다른 서비스에도 인증과 인가를 제공할 수 있게 되는 계기가 되었습니다.
      • oauth 표준 기준을 통해 인증과 인가 서비스 제공

📍 JWT에서 발전된 Oauth

Oauth 2.0

  • 외부 서비스의 인증 및 권한 부여를 관리하는 범용 프로토콜
  • JWT 이용으로 인해 다른 서비스에 인증과 인가 제공이 가능해졌기 때문에 당연히 Oauth는 JWT 방식

📍 JWT 토큰의 단점을 해결하는 RefreshToken

JWT 토큰 단점 - 보안 이슈

위에서 설명한 것처럼 탈취된 토큰을 악의적인 사용자가 사용하는 걸 알아차려도 서버를 해결할 방법이 없다는 것이 JWT의 한계입니다. 이를 해결하기 위해 토큰 만료일의 시간을 짧게 가져갈 수 있는데, 이렇게 되면 사용자가 더 자주 로그인을 해야 하는 불편함이 발생합니다. 이걸 해결하기 위해서 RefreshToken을 사용할 수 있습니다.

RefreshToken

  • 토큰 갱신을 위해 사용하는 토큰
  • 토큰을 발급할 때 RefreshToken을 같이 발급해 서버에 저장해 두었다가 토큰 만료 시에 RefreshToken을 이용해 토큰을 갱신
  • RefreshToken을 서버에 저장하므로 서버 부하가 발생할 수도 있고, 새 AccessToken 갱신은 서버에 저장된 RefreshToken이 필요해 인증 서버에서 처리해야 합니다.
  • 그러나 인가는 다른 서버에서 처리할 수 있기 때문에 인증과 인가 모두 한 서버에서 처리해야 하는 Session 보다 부하가 작습니다.

AccessToken과 RefreshToken 동작 방식

  • Authentication ( 인증 )
    1. 클라이언트가 로그인 요청
    2. DB에서 회원 정보 확인 후, AccessToken과 RefreshToken 발급
    3. DB에 RefreshToken 저장
    4. 클라이언트에 AccessToken과 RefreshToken 반환
      인증
  • Authorization ( 인가 )
    1. 클라이언트가 AccessToken으로 글쓰기 저장 요청
    2. AccessToken 유효성 확인 후, 요청 처리
    3. 응답 반환
      인가
  • AccessToken 갱신
    AccessToken 만료되었을 경우, RefreshToken으로 AccessToken을 갱신해야 합니다.
    1. 클라이언트에서 AccessToken과 RefreshToken으로 AccessToken 갱신 요청
    2. DB에서 RefreshToken 정보 가져오기
    3. RefreshToken 확인 후, 새 AccessToken 생성
    4. 새 AccessToken 반환
      accessToken 갱신

RefreshToken 한계

JWT 방식을 사용하고 RefreshToken을 추가한다고해서 잦은 로그아웃 문제도 해결되면서도 안전한 온전한 방법은 아닙니다. 악의적인 사용자가 토큰을 사용하는 것을 완전히 막을 수는 없기 때문입니다.

AccessToken이 탈취되면 만료일이 짧다고해도 만료일까지는 악의적인 사용자가 토큰을 사용하는 것을 막을 수 없고, AccessToken과 RefreshToken이 모두 탈취되었다면 악의적인 사용자가 AccessToken을 쓰다가 만료시에 RefreshToken으로 갱신할 수 있기 때문입니다. 두 개의 토큰 모두 탈취되는 것을 막고자 두 토큰을 서로다른 저장소에 넣어서 이를 방지할 순 있지만 아예 탈취를 막을 순 없기 때문에 한계가 있습니다.

마무리

요즘 JWT를 이용한 인증방식을 주로 사용하지만 이 방식도 안전한 방식은 아니기 때문에 쿠키 옵션이나 그 밖의 방식들을 이용해 토큰 탈취를 최대한 막기 위한 노력이 필요합니다.


[참고자료]

쉽게 알아보는 서버 인증 2편(Access Token + Refresh Token)
[JWT] JSON Web Token 소개 및 구조

profile
생각하는 개발자가 되겠습니다 💡

0개의 댓글