토큰을 사용한 인증과 인가

2023. 7. 10. 04:18Web

728x90

https://rasony.tistory.com/148

 

토큰을 사용하는 이유

로그인을 세션으로 구현한다고 하면 주변에서 시선이 느껴지는 경험을 다들 해본 적이 있을 것이다. 그렇다면 쿠키와 세션으로 로그인을 구현하면 도대체 어떤 문제가 발생하길래 다들 이렇게

rasony.tistory.com

 

안녕하세요 저번 포스팅에 이어서 토큰을 활용한 인증과 인가에 대해서 포스팅해보겠습니다.

 

AccessToken

 

AccessToken은 사용자가 자원에 접근하기 위해서 사용하는 토큰이다.

 

즉, 사용자가 해당 자원에 접근해도 되는 사용자인 지를 확인할 때 사용한다.

 

토큰은 stateless 즉 서버가 토큰에 대한 제어권을 가지고 있지 않기 때문에 만약, 토큰을 중간에 탈취당한다면 속수무책으로 당할 수 밖에 없다.

따라서, AccessToken의 유효 기한을 짧게 가져가 그나마 안전할 수 있게 만들 수있다.(어플마다 유효 기한은 다르다.)

 

RefreshToken

 

RefreshToken은 기존의 사용자의 AccessToken이 만료되었을 때 재발급 받기 위해 사용된다.

 

위에서 언급하였듯이 AccessToken은 유효 기한을 짧게 가져갈 수밖에 없다. 

 

만약, 사용자의 AccessToken이 만료되었을 때 사용자는  로그아웃과같은 경험을 하게 될 것이다. 이를 방지하기 위해서 RefreshToken을 사용하여 재발급을 받는다.

그리고, 사용 목적에 맞게 AccessToken보다 유효 기한을 길게 가져간다.

 

 


 

AccessToken과 RefreshToken의 매커니즘

 

 

먼저, 아이디와 비밀번호를 가지고 서버에 요청을 보낸다.

 

 

 

성공시에는 위의 그림과 같이 AccessToken과 RefreshToken을 생성하여 반환한다.

만약, 실패시에는 각자의 상황에 맞는 응답을 해준다.

 

 

 

 

로그인한 이후에는 자원을 요청할 때 AccessToken과 함께 요청을 한다. 서버는 요청을 받으면 AccessToken을 검증하여 이 토큰이 잘못된 토큰인 지 유효 기한은 지났는 지의 여부를 판단해 알맞은 응답을 내려준다.

 

만약, 올바른 토큰이라면 위의 그림과 같이 데이터를 반환한다.

 

 

 

 

만약, 유효기간이 지난 토큰이라면 아래와같은 응답 메시지와 함께 RefreshToken을 사용해서 AccessToken을 재발행하라고 응답 메시지를 남겨준다.

 

 

재발행 요청시 AccessToken과 RefreshToken을 활용하여 서버가 올바른 토큰인 지, 유효 기한은 지나지 않았는 지 두 토큰의 짝이 맞는 지등의 여부를 판단해 맞다면 위와 같이 AccessToken과 RefreshToken을 재발행해준다.

 

이때, AccessToken은 HTTP Authorization 헤더에 담고, RefreshToken과 같은 경우에는 Set - Cookie 헤더에 담아서 요청과 응답한다.

 

 

왜? AccessToken은 HTTP Authorization 헤더에 담는가??

 

Authorization 헤더는 보호된 리소스에 대한 엑세스를 요청할 때 사용되는 헤더이기때문이다. (HTTP 즉 프로토콜, 규약이다.)

 

 

 

RefreshToken을 쿠키에 담아서 전송하는 이유는 무엇일까??

  1. XSS 공격(토큰 값을 가져오는 것)을 막을 수 있다. → HTTP only 옵션 + secure 옵션 사용
  2. CSRF 공격에 취약(로그인 된 상태로 위험한 동작을 하려하는 것)
    1. 리프레시 토큰을 가지고 할 수 있는 것은 재발급 요청밖에 없다.
    2. 이에 대한 방어만 갖춘다면, Cookie에 담아서 응답할 때의 이점이 많다. 



마지막으로, RefreshToken을 사용하는 방식에는 RTR(Refresh Token Rotation)이란 것도 있다.


이는 RefreshToken을 일회용으로 사용하여 최대한 보안을 잡는 방법이다!!

 

 

지금까지, 토큰을 사용한 인증과 인가 포스팅이었습니다.

 

감사합니다!!

 

 

728x90

'Web' 카테고리의 다른 글

DNS(Domain Name System)  (0) 2024.01.21
토큰을 사용하는 이유  (0) 2023.07.03
Postman에서 토큰 자동 설정하는 방법  (1) 2023.05.14
배치(Batch)란?  (0) 2023.04.06
동기 비동기 개념  (0) 2023.04.06