Home 로그인 인증방식 (세션, 토큰)
Post
Cancel

로그인 인증방식 (세션, 토큰)

로그인

네이버에 로그인을 한 후 새로고침을 한다거나 다른 탭을 열어 네이버에 접속해도 로그인이 유지가 된다. 이런 것은 어떻게 구현할까?

로그인은 세션 기반 인증방식 또는 토큰 기반 인증방식으로 구현된다.

HTTP의 특징 중 하나는 Stateless 하다는 것이다. HTTP 요청이 끝나면 사용자의 정보를 저장하지 않는 것이다. 이러한 특성 때문에 로그인한 상태값을 저장하지 않는데 로그인을 어떻게 유지하느냐 라는 의문이 들게 된다.

세션기반 인증방식

  • 세션 : 서버와 클라이언트의 연결이 활성화 된 상태를 의미한다.
  • 세션 ID : 웹 서버 또는 DB에 저장되는 클라이언트에 대한 유니크한 ID.

  1. HTTP요청으로 처음 로그인을 한다.
  2. 세션ID가 생성된다.
  3. 서버에서 세션 ID를 쿠키로 세팅해 클라이언트에 전달한다.
  4. 쿠키의 특성으로 인해 이제부터 클라이언트가 서버에 요청을 보낼 때 해당 세션 ID를 쿠키로 요청 헤더에 담아 보내기 때문에 이를 통해 해당 세션이 맞는지, 그리고 유효한지 체크하게 된다.
  5. 로그인을 유지한다.

단점

세션 ID가 웹서버 또는 DB에 저장된다고 했는데 DB에 저장됐을 경우 이 값을 사용하기 위한 직렬화, 역직렬화의 COST가 발생하게 된다.

웹서버에 저장할 경우에는 서버 메모리가 비교적 많이 사용되는 단점이 있다.

둘 다 그 크기가 크지 않다.

토큰 기반 인증 방식

간단하게는 유저의 상태값을 토큰에 토큰만을 위한 서버를 두어 관리하고, 다른 컨텐츠를 제공하는 서버는 모두 Stateless하게 유지한다는 방식이다.

왜 토큰을 두는 서버를 따로 관리해야하느냐?

여러 개의 서버를 운용한다고 가정했을 때, 서버 하나가 토큰기반인증 + A도메인을 처리하는 서버로 구축될 경우 A도메인에서 에러가 발생하면 인증에 대한 기능도 같이 마비가 되고 이는 다른 인증이 필요한 B,C,D 도메인 기능도 마비될 수 있기 때문이다.

  1. 위와 같이 유저가 인증로직을 거치면 JWT 토큰을 생성한다 (access토큰, refresh 토큰).
  2. 사용자가 이후에 access 토큰을 HTTP header - Authorization 또는 HTTP header - Cookie에 담아 인증이 필요한 서버에 요청해 원하는 컨텐츠를 가져온다.

JWT 토큰

JWT는 JSON Web Token을 의미하며 헤더, 페이로드, 서명으로 이루어져 있다. JSON 객체로 인코딩되며 메시지 인증, 암호화에 사용된다.

  • Header : 토큰 유형, 서명 알고리즘이 있다. base64URI로 인코딩된다.
  • Payload : 데이터, 토큰 발급자, 토큰 유효기간이 있다. base64URI로 인코딩된다.
  • Signature : (인코딩된 header + payload) + 비밀 키를 기반으로 헤더에 명시된 알고리즘으로 다시 생성한 서명 값.

장점

  1. 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함되기 때문에 별도의 인증 저장소가 필요 없다.
  2. 다른 유형의 토큰과 비교했을 때 경량화되어있다.
  3. 디코딩했을 때 JSON이 나오기 때문에 JSON을 기반으로 쉽게 직렬화, 역직렬화가 가능하다.

단점

  1. 토큰이 비대해질 경우 서버 과부하에 영향을 줄 수 있다.
  2. 토큰을 탈취당할 경우 디코딩했을 때 데이터를 볼 수 있다. (가장 큰 단점)

access 토큰, refresh 토큰

access 토큰을 탈취당했을 때 탈취자의 접근을 막기 위해 access 토큰의 만료기한을 짧게 두는 방식으로 막는다. 하지만 이렇게 하면 새로은 access 토큰을 발급받아야 하기 때문에 로그인을 계속 다시 해주어야 하는 단점이 있다.

이를 보완해주는 것이 refresh 토큰이다. refresh 토큰은 만료기한이 길고 이 토큰을 기반으로 access 토큰이 만료될 때 마다 인증에 관한 비용을 줄일 수 있게 된다. 더해 access 토큰이 만료되거나 사용자가 새로고침을 할 때 refresh 토큰을 기반으로 새로운 access 토큰을 얻는다.

참고

  • Bearer [token] 으로 Bearer을 앞에 두어 토큰기반인증방식이라는 것을 알려주어야 한다.
  • https를 사용해야 한다.
  • 쿠키에 저장한다면 sameSite : ‘Strict’를 써야 한다.
  • 수명이 짧은 access token을 발급해야 한다.
  • url에 토큰을 전달하지 말아야 한다.
This post is licensed under CC BY 4.0 by the author.

웹 브라우저 캐시

HTTP 웹 지식 - HTTP 메서드, 메서드의 활용