[backend] token을 통한 인증

k·2024년 1월 23일
3

backend

목록 보기
1/4

백엔드에 대해서 공부를 하면서 token이라는 개념을 많이 들었다. 이는 왜 사용하고 언제 사용하고 도대체 어떤 방식으로 사용하는지 궁금해서 정리를 하게 되었다.

oreilly ref

1. token을 통한 인증이란?

token을 통한 인증에 대해 공부하다보면, 보통 restful apistateless라는 키워드가 주로 등장한다.

restful한 api 를 만들기 위해서 token을 주로 사용한다고 하는데, session을 통한 인증은 그럼 restful하지 않은걸까?

이러한 키워드가 주로 등장하는 이유는 token을 통한 인증에 대한 특성에 있다.

session은 보통 사용자가 로그인을 요청하게 되면 서버 내의 session storage 에 저장 되어서 클라이언트인지 확인하게 된다. 이를 통해 클라이언트가 페이지에 접속하고 꺼질 때까지 상태 유지를 하게 되는데 이게 보통 session 을 통한 인증 방식이다.

그런데 token은 session과 다르게 state를 유지하지않는 stateless의 특성을 띈다. 예를 들어서, 사용자가 로그인을 요청하게 되면 서버 내에서 이 사용자가 유효한 사용자인지 판단 후, 사용자를 식별할 수 있는 정보 중에 중요하거나 민감하지않는 정보를 payload(ID, username)에 담고 그를 암호화하여 token을 만들게 된다. 이를 클라이언트에 제공하고, 어떠한 접근권한이 필요한 곳에 접근하려 할 때, 발급 받은 token을 서버에서 보여주며, 내가 유효한 사용자 인지를 증명하는 것이 일반적인 token을 통한 인증 방식이다.

1-1. token으로 어떻게 유효한 사용자인지 알 수 있을까?

  • 만료되지 않은 토큰인가?
  • 서버 내에서 발행한 토큰인가? (secret / algorithm 의 일치)
  • 토큰내의 payload가 유효한가?

대표적으로 위의 형태를 체크하여 유효한 사용자인지 판별할 수 있다.

1-2. token을 통한 인증을 사용하는 이유

아까 위에서도 말헀지만, stateless하게 하기 위해서이다. 그렇다면 stateless라는 녀석이 도대체 무엇이길래 굳이 token을 사용하려고 하는 걸까?

stateless는 말 그대로 서버와의 연결을 통한 상태유지를 하지않고, 인증이 필요할 때만, 요청과 동시에 token을 보여주면서 내가 유효한 사용자임을 증명한다. 이는 사용자가 적을 때는 오히려 session을 통한 방식이 더 효율적일 수 도 있지만, 사용자가 늘어났을 때는 stateless하는 것으로 서버의 부하를 줄일 수 있다. 그렇기 때문에, 많은 Oauth 형태에서 token을 통한 인증을 볼 수 있다.

2. access token 과 refresh token 이란?

token을 통한 인증을 공부하면서, access token과 refresh token에 대해서 많이 들었었다.

먼저, access token은 말 그대로 접근을 위한 토큰이다.

그리고 refresh token은 access token이 만료되면, refresh token을 통해서 access token을 다시 발급할 수 있게 된다.

보통은 보안성을 증진하기 위해서 access token을 발행할 때, 짧은 만료주기를 주고, refresh token을 발행할 때, 긴 만료주기를 주게 되면서, access token이 탈취 당해도, 짧은 유효시간을 가지므로 별로 의미가 없게 만들 수 있다. 하지만 이 것도 refresh token이 탈취 당하게 되면 무용지물이 된다. 그렇기에 refresh token을 탈취 당하기 힘들게 해야한다.

2-1 access token만을 사용했을 때 취약점

위에서도 언급했지만, access token만을 사용하게 되면 만료 주기를 사용자가 사용할 수 있을 만큼 충분한 기간을 주어야하는데 이 때, token이 탈취 당하게 되면, 합법적이지않은 경로를 통해서 인증을 받을 수 있게 된다.

그렇기 때문에 refresh token을 운용하여 탈취 되었을 때, 사용자가 이를 사용할 수 있는 시간을 최소화 하여야한다.

2-2 refresh token rotation

보통 개발을 하다보면, refresh token을 반영구로 사용하는 사람도 많이 있다. 그 것이 틀린 방법이라고 생각하진 않지만, 확실한 건 refresh token을 탈취 당할 수 있는 확률이 증가하게 된다.

안전하게 이를 운용하려면, refresh token은 1회성으로 운용하는 것이 좋다. refresh token을 통해서 한번 재발급을 받게 되면, 새로운 refresh token을 주면서 보안성을 증진 시킬 수 있다. 이러한 방법을 refresh token rotation 이라고 한다.

예를 들어, 이미 사용자가 사용한 refresh token을 탈취하게 되면, 서버는 이 것을 통해서 탈취한 상대에 대한 추가적인 조치를 취할 수 있다.

앞서 말한 refresh token rotation을 통해서도, 완벽하게 보안에 대한 처리가 되지는 않는다. 왜냐면, refresh token 이 rotation되기 전에 탈취해버리면 아무 소용없기 떄문이다. 그렇다면, 추가적인 보안처리는 어떻게 할 수 있을까? 좀 더 탈취를 어렵게 하면 된다.

즉, refresh token을 cookie 내에 http-only 옵션을 포함하여 클라이언트에 주면 된다.

http-only 옵션을 브라우저 상에서 해당 쿠키에 대한 접근을 할 수 없도록 막을 수 있는 옵션이다.

이러한 조치까지 취해주게 되면, 보다 안전한 token운용을 할 수 있다.

profile
You must do the things you think you cannot do

0개의 댓글