• 세션로그인 방식

    • 세션이라는 용어는 클라이언트와 서버 간의 인증을 위해 유지되는 상태 정보를 저장하는 서버의 저장공간을 의미

    • 세션 방식 상세 절차

      image.png

      • 사용자 로그인 요청
      • DB에서 로그인 정보 확인 및 세션ID 생성
      • 서버 메모리에 세션ID값을 저장(또는 캐싱DB)
      • 세션ID를 사용자에게 전달
      • 사용자는 세션ID를 쿠키파일로 저장하고, API 요청시 세션ID를 담아 요청
      • 메모리상의 세션값과 비교/검증 후 API 응답
    • 쿠키

      • 쿠키는 웹사이트가 사용자의 웹 브라우저에 저장하는 작은 텍스트 파일
        • 대표적인 예시는 비밀번호 저장
        • “비밀번호를 저장하시겠습니까?” 등 쿠키파일로 id/pw가 웹브라우저에 저장
      • 세션방식에서는 쿠키에 검증값(세션ID)를 넣어 사용자에게 전달하는 세션ID를 담는 파일로 활용
    • 세션방식의 단점

      • 대규모 로그인 및 HTTP요청시 서버 메모리 부족
      • 메모리 접근 과정의 성능문제
      • 메모리 기반의 세션관리시 서버 확장시 관리불가
        • 대안)세션을 DB(REDIS)에 저장

        • redis의 빠른 속도의 장점을 활용하여, session값을 저장해두는 storage로 사용

          Untitled

  • 세션방식 로그인 절차와 검증 절차

    • 로그인
      • id/pw를 입력하여 login시도
        • UserDetailsService에서 loadUserByUsername을 통해 DB에서 조회한 User객체 생성
      • AuthenticationProvider객체에서 사용자가 넣어온 id/pw와 DB에서 조회한 User객체와 비교 후 검증
      • 로그인 성공시에 Authentication객체에 사용자정보(email, role등)을 담고, 사용자에게 SESSIONID를 전달
    • 검증절차
      • 사용자는 api요청시에 쿠키에 sessionId를 담아 서버에 api요청
      • 서버에서는 session에 저장된 sessionId를 사용자가 요청한것과 비교하여 검증
  • 로그인 절차와 인증 관련 주요 객체

    Untitled

    • Authentication 객체
      • 이 객체는 세션 기반 인증과 토큰 기반 인증 모두에서 사용되며, Spring Security의 핵심 인터페이스 중 하나
      • 인증 요청 성공시 해당객체에 사용자의 인증정보 보관
      • 이 정보에는 사용자의 주요 정보(사용자 이름 또는 email), 권한(Granted Authorities) 등이 포함
    • SecurityContext 객체
      • Authentication 객체가 저장되는 보관소
      • 인증이 완료되면 SecurityContext 는 SecurityContextHolder에 담기고 별도로 email등을 HttpSession에 저장시 프로그램 전역에서 참조 가능
        • 세션인증시스템에서는 Authentication객체가 생성되어 SecurityContextHolder에 저장
        • 토큰 인증시스템에서는 동일하게 Authentication객체가 생성되어 SecurityContextHolder에 저장이 되고 사용자의 요청 thread에 한정된 일시적인 저장
    • UserDetailsService
      • loadUserByUsername 오버라이딩하여 DB에서 유저 정보를 가져오는 역할
        • AuthenticationProvider
          • 가져온 유저정보를 사용자가 입력한 정보와 비교
          • 유저정보 비교후 성공시 UsernamePasswordAuthenticationToken을 생성후 Authentication객체에 저장
        • UserDetails
          • UserDetailsService에서 return된 사용자의 정보가 담기는 인터페이스
          • User객체가 구현하여 유저객체를 리턴