OAuth #4 액세스 토큰, 리프레쉬 토큰

hamingu·2021년 6월 14일
0

OAuth

목록 보기
4/5
post-thumbnail

지난 글에서 OAuth 2.0의 인가 코드 그랜트 동작 방식을 아주 아주.. 매우 간략하게 살펴봤다.
그 가운데 access token을 통해 서비스 제공자의 리소스에 접근할 수 있었는데
그렇다면 access token은 보호된 리소스에 접근할 수 있는 출입증? 열쇠? 와 비슷한 역할을 한다는 걸 알 수 있었다.

이번 글에서는 access token이 정확히 어떤 역할을 하는지 추가로 refresh token이 무엇인지 알아보도록 하자

액세스 토큰

액세스 토큰을 기술적인 용어로 설명하면 다음과 같다고 한다.

  • 하나 또는 다수의 보호된 리소스에 대해 일정 기간 동안 접근할 수 있는 권한을 캡슐화 한 것

액세스 토크는 보통 임의의 문자열 형태로 클라이언트에게 발급되며, 위의 설명처럼 접근 권한 뿐만이 아닌 기간 또한 통제할 수 있다.

즉 기술적인 용어를 좀 더 해석해보자면 액세스 토큰은 범위와 기간의 속성을 가지고 있다고 볼 수 있다.

범위

우리는 액세스 토큰으로 특정 리소스에 대한 접근 권한을 증명하고 접근할 수 있다고 배웠다.
정말 쉽게 이야기하자면 이 특정 리소스가 바로 범위에 해당할 것이다.

앞선 글에서는 계속 소셜 로그인을 중심으로 설명했는데 소셜 로그인은 OAuth 2.0의 사용 예일 뿐이며 OAuth 2.0의 조금 더 답에 가까운 의미는 서비스 제공자가 보유한 사용자의 데이터에 접근하고 안전하게 주고 받는 방법이다.

즉 소셜 로그인을 위해 회원 정보라는 범위가 지정된 리소스에 접근할 수 있는 액세스 토큰을 받은 것이며 이 토큰을 사용하여 우린 사용자의 회원 정보를 받아올 수 있었다.

다르게 설명하자면 인스타를 예로 설명해보자.

사용자의 인스타 팔로워 정보를 받아오는 과정을 구현하고 있다면 (서비스 제공자가 구현을 해놓았다는 가정 하에) 우리는 인스타 팔로워 정보에 해당하는 액세스 토큰을 요청하고 받아온 후 해당 토큰으로 팔로워 정보를 받아오는 것이다. 여기서 인스타 팔로워 정보가 액세스 토큰의 범위에 해당된다고 볼 수 있다.

기간

대부분의 액세스 토큰은 접근 권한의 유효기간 즉 만료되는 시간을 갖게 된다.
대부분이라는 뜻은 정말 극히 매우 매우 드물게 그렇지 않은.. 영구 토큰(영구 없다)이라는 만료기간이 없는 토큰이 있다고는 하는데..
토큰의 만료기간이 존재하는 이유 중 토큰이 유출되었을 시 피해를 방지하기 위함임을 생각해보면 정말 말 그대로 영구토큰을 발급하는건 매우 드문 일이라는 걸 알 수 있다.

기간은 보통 30분에서 몇 시간 정도로 정해진다고 하는데 이에 대해 검색해서 알아본 결과

기간을 정하는 기준은 요청 범위나 권한에 따라 달라진다고 한다.

예를들어 민감한 정보를 다루는 범위에 대해 접근한다거나 권한이 정보를 읽기만 하는 것이 아닌 수정까지 할 수 있다고 한다면 유출되었을 시 피해가 매우 클 수 있다.
이런 경우는 당연히 그 기간이 매우 짧을 것으로 예상할 수 있다.

반대로 액세스 토큰의 범위가 그다지 민감하지 않은 정보를 포함하고 있으며 해당 정보를 수정할 수 있는 권한은 없고 단지 읽을 수만 있다면 기간을 너무 타이트하게 잡을 필요는 없을 수 있을 것이다.

유출되면 큰일 난다요..!

액세스 토큰을 사용할 때 서비스 제공자는 받은 액세스 토큰이 어떤 방법으로 생겨났는지에 대해 알아보지 않는 다고 한다.

이 말이 무슨 말이냐 하면 해당 토큰의 기간이 만료되지 않았다면.. 이 토큰을 난 A한테 줬는데 왜 B가 가져왔을까에 대한 물음 없이 해당 토큰이 담고 있는 접근 권한을 이용해 접근할 수 있게 해준다는 뜻이다.

학습하면서 액세스 토큰의 만료 기간이 중요한 이유가
결국 보안 상의 문제를 완벽히 해결할 수는 없겠지만 어느정도 보완하기 위한 방법으로 사용될 수 있어서라고 생각했다.

하지만 이 보완책으로 인해 불편한 요소가 생길 수 있을 것 같다.
바로 만료 기한이 매우 짧을 경우.. 토큰을 얻기위한 그 복잡한 플로우를 다시 돌아야 하는 걸까??

정답은 그럴 수도.. 아닐 수도..?

복잡한 플로우를 다시 돌지 않기위해 액세스 토큰을 갱신하게 할 수 있는 리프레쉬 토큰이라는게 존재한다.
존재하는데 왜 아닐 수도 있냐구요..?? (글쎄 서비스 제공자가 리프레쉬 토큰을 제공하지 않는 경우도 있데요... 진짜..?)

리프레쉬 토큰

만약 서비스 제공자가 리프레쉬 토큰을 제공한다면 액세스 토큰을 전달 받을 때 같이 전달받게 될 것이다.
리프레쉬 토큰은 앞서 설명한대로 액세스 토큰의 기간이 만료되어 새로 액세스 토큰을 요청할 때 갱신을 위해 사용된다.

이는 신뢰 클라이언트에서만 사용될 수 있다고 한다.
그 이유를 살펴보니 클라이언트가 액세스 토큰이 만료되었을 때 사용하기 위해 이 리프레쉬 토큰을 저장해놔야 하는데 비신뢰 클라이언트는 데이터를 안전하게 저장할 수 없기 때문에 사용이 불가능하다.

아니 더 정확히 말하자면 비신뢰 클라이언트에게는 리프레쉬 토큰이 전달 자체가 되질 않는다.

리프레쉬 토큰이 없다면요..?

아까 설명했다시피.. 복잡한 플로우를 다시 도는 방법 말고는 없다..!!

리프레쉬 토큰도 기간이 있나요..??

있다고 한다..! 리프레쉬 토큰의 기간마저 만료된다면 역시 복잡한 플로우를 다시 돌아야한다..!!

다음 POST

다음 post에는 JWT에 대해 알아보며 일반적인 oauth와 jwt의 차이가 무엇인지와 jwt의 장단점 등에 대해 정리해보려 한다....!(그나저나 그 흔한 이모지 없이.. 이미지 없이.. 텍스트 뿐인 블로그 글.. 난 벨로그를 잘 활용하고 있는걸까?)

profile
프로그래밍구

0개의 댓글