본문 바로가기

DEVELOP/Node.js

[Auth] Session과 Token은 서로 절충 가능한가?

반응형
Session 과 Token은 모두 웹 브라우저에서 인증을 위해 사용되는 방식이다. 사용자의 정보를 인증받고 그에 대한 정보를 저장한다.

1-1. Session 

 클라이언트와 서버간의 관계를 활성화 된 상태로 유지하기 위해 서버에서 클라이언트에 유니크한 아이디를 부여하고 서버 측에서 관리하도록 하는데, 이 자체를 바로 세션이라 한다. 사용자에 대한 민감한 정보들은 세션으로 관리하는데, 사용자가 웹 브라우저에 이용하면서 탈취당하는 경우보다, 서버가 해킹당하는 경우가 일반적으로 더 적기 때문에 서버에 인증의 책임을 더 부여하는 것이다. (물론 요청 자체를 가로챈다면 요청 내부에 있는 쿠키도 탈취가 가능하기 때문에, 이 경우까지 막기 위해서는 https 방식을 통해 요청 자체를 읽기 힘들게 만들거나 세션에 유효 시간을 설정하는 방식 등을 사용해야 한다.) 서버에서 세션 아이디는 쿠키에 담아 응답으로 전송하며, 인증이 필요하면 그때마다 헤더에 쿠키를 담아서 요청을 보낸다. 사용자가 보낸 쿠키에서 세션 아이디를 세션 스토어의 값과 비교한 후 검증이 정상적으로 이루어졌다면 사용자가 요청한 데이터를 응답으로 전송한다. 

 

1-2. Session Authentication

세션 인증 과정

세션 기반의 인증은 서버 또는 별개의 데이터베이스에 유저 정보를 담고 인증하는 방식으로, 서버에 민감하거나 제한된 정보에 대한 요청이 들어온 경우 정보를 제공해도 괜찮은지에 대해 세션값이 일치하는지 확인하여 진행한다. 서버에 세션을 저장해야 하기 때문에 리소스의 소모가 생기고 관리에 대한 부분 역시 문제가 생길 수 있다.

 간단하게 로그인을 예로 들어 세션 인증 과정을 설명하면 다음과 같다. 우리가 사용자 로그인을 하기 위해 서버에 요청을 보내면, 서버에서는 해당 사용자의 정보를 확인한 후 세션 저장소에 보관한다. 유니크한 세션 아이디를 발급하고, 세션 아이디를 담은 쿠키를 헤더에 담아 전송해주는 것을 그림에서 확인할 수 있다. 만약 사용자가 로그인한 상태에서 장바구니에 물건을 넣는 것과 같이 사용자 인증이 요구되는 작업을 한다면, 세션아이디를 쿠키에 담아 서버에 요청하고 서버에서는 세션 아이디의 값이 맞는지 확인한 뒤 유효한 경우 작업을 완료하고 클라이언트에 응답을 전송한다. 


2-1. Token

토큰은 세션과 반대로 유저의 정보를 암호화 하여 클라이언트와 서버 사이에서 서로 넘겨주며 보안과 인증을 처리하는 방식이다. 사용자의 인증에 대한 정보를 세션이나 서버에 저장하지 않고, 요청에서 주어진 token이 확실한지만을 확인한다. 이것은 세션과의 가장 큰 차이점인데, 서버 사이드에서 개별로 세션 스토어에 저장하는 것이 아니라 클라이언트로부터 전달된 요청만으로 작업이 처리되기 때문이다. 세션의 경우에는 우리가 어떤 작업을 처리하고자 할 때 사용자가 어느 곳에서 어떤 요청을 했는지에 대해 파악할 필요성이 있지만 토큰은 말 그대로 토큰이 존재하며 그 토큰이 해당 사용자 인증에 일치하는 토큰인지만 확인하면 데이터베이스에서 데이터를 요청한 후 응답으로 보내주기만 하면 되기 때문에 훨씬 효율적이다.

 

2-2. Token Authentication

토큰 인증 과정

 토큰을 위한 인증 과정에서는 세션스토어처럼 세션 아이디나 유저 정보를 따로 저장하는 곳이 없음을 확인할 수 있다. 사용자가 로그인 요청을 보낸다면 서버에서는 제공된 사용자 정보에 대해 확인한 뒤 토큰을 발행하고 클라이언트로 전송해준다. 만약 로그인한 사용자가 어떤 작업을 하고자 한다면 클라이언트에서는 서버에 대한 요청에 토큰을 함께 전송하고, 서버에서는 토큰을 해독한 뒤 요청에 대한 작업을 해결해 응답으로 데이터를 전송한다.  


3.  Session vs Token

  • 세션 인증 방식은 쿠키를 매개로 하여 인증이 이루어지기 때문에 쿠키 자체가 노출이 되더라도 세션 아이디 자체가 의미있는 값을 가지지 않으며 회원 정보에 대한 확인 없이 서버에서 리소스로 접근해서 데이터를 알 수 있다는 점 등을 장점으로 가진다. 반대로 토큰은 클라이언트에 보통 저장되기 때문에 데이터베이스 쪽에서 변경 사항이 일어나거나 조작이 발생해도 토큰에 적용하는 것이 어려우며 만약 토큰의 크기가 사용자 인증 정보를 위한 필드가 추가됨에 따라 커질 경우 데이터의 트래픽 크기에 영향을 끼칠 수 있다. 
  • 하지만 위에서 언급한 것과 같이 세션은 요청 자체를 탈취당할 경우에는 심각한 보안 문제가 발생할 수 있다. 또한 인증과정 자체가 토큰에 비해 서버에 부하가 훨씬 많이 가는 방식이다. 토큰은 서버를 구축할 때 상대적으로 더 독립적이고 명료한 코드를 작성할 수 있기 때문에 유지 보수에도 좀 더 용이하다고 볼 수 있다. 
  • 사실 세션과 토큰을 같이 사용하는 것 자체에는 문제가 없다. 왜냐하면 세션 아이디가 발급되는 것 자체가 사용자 인증을 의미하는 것은 아니기 때문이다. 하지만 두 방식을 통한 사용자의 인증이 서로 '절충'이 가능한가를 두고 생각해 본다면, 서버 측에서 인증을 위해 암호화를 해야할지 개별적인 저장 장소를 설정해야 할지에 대해 차이를 가지게 되므로 각 상황마다 좀 더 적합하다고 생각되는 방식 중 하나를 택하여 사용하는 것이 더 좋을 것 같다고 생각된다. 

Reference

 

반응형

'DEVELOP > Node.js' 카테고리의 다른 글

MVC 패턴이란 무엇인가?  (0) 2021.06.17
[Authentication] Cookie/Session  (0) 2021.04.14