실무 프로젝트로 배우는 Kotlin & Spring/회원 인증 서비스 개발하기

토큰 기반 인증

webmaster 2022. 12. 13. 20:26
728x90

세션 기반 인증

세션 기반 인증

  • 세션 기반 인증 방식은 서버가 클라이언트의 세션 정보를 저장하고 있는 stateful 한 방식이다.
  • 사용자가 로그인을 하게 되면, 서버는 사용자 정보 검증 후, 세션 id를 발급하고 브라우저의 쿠키에 저장한다.
  • 브라우저는 모든 요청마다 쿠키에 있는 세션 id를 포함, 서버는 세션 id를 통해 유저 정보를 세션 스토리지에서 조회
  • 일반적으로 서버 메모리, DB 등을 사용해 세션을 저장한다.
  • 세션은 서버에서 만료시켜, 클라이언트의 권한을 회수할 수 있다.
  • 단점 
    • 서버 확장 어렵다(분산 환경에서는 세션을 공유할 수 있는 세션  클러스터링 필요)
    • 중앙에서 세션을 관리할 수 있는 세션 DB를 구축해야 한다.
    • 요청이 많아지면 세션 조회에 따른 DB 부하가 심해질 수 있다.

토큰 기반 인증

토큰 기반 인증

  • 토큰 기반 인증 방식은 서버가 클라이언트의 세션을 저장하지 않기 때문에 stateless 방식이다(대표적으로 JWT가 있다)
  • 사용자가 로그인을 하게 되면 서버는 사용자 정보 검증 후 토큰을 발급, 응답으로 내려준다.
  • 클라이언트는 토큰을 저장하고 있다가 Authorization 헤더에 토큰을 전달한다.
    • 서버가 분산된 환경에서도 서버에서 클러스터링이 필요 없다.
  • JWT 토큰 내부에는 기본적인 정보, 검증된 토큰임을 증명하는 서명 같은 정보가 들어있다.
  • 토큰 안에 유용한 정보가 있어 IO 작업을 하지 않아도 정보를 알 수 있다
  • 단점
    • 한번 발행된 토큰은 클라이언트가 보관하여 회수하기 어렵다.
    • 회수가 어렵고 탈취되면 대처가 어려우므로 만료시간을 짧게 가지고 가야 한다.
    • 토큰이 길어지면 네트워크 부하가 커질 수 있다.
    • payload는 암호화된 정보가 아니기 때문에 민감정보를 담지 말자.
    • JWT 인 경우 단일 키를 사용하기 때문에 시크릿 키가 유출되면, 취약사항이다.

JWT 구조

  • 헤더 : 토큰 타입과 서명 알고리즘으로 이뤄져 있다.
  • payload: 토큰 발급자, 토큰 유통기간, 유저 등을 정의한다.
  • 서명: 메시지 전송 과정에서 바뀌지 않은 것을 확인하는 보안 서명
728x90

'실무 프로젝트로 배우는 Kotlin & Spring > 회원 인증 서비스 개발하기' 카테고리의 다른 글

회원가입  (0) 2022.12.14
JWT 기반 인증 구현  (0) 2022.12.13
공통 에러 처리  (0) 2022.12.13
API 스펙 정의  (0) 2022.12.13
프로젝트 구성하기  (0) 2022.12.13