• SpringSecurity

    • Spring Security는 Spring 기반의 애플리케이션에서 인증, 인가(권한) 위한 라이브러리
      • 주요 기능
        • 인증(Authentication)
          • 사용자가 누구인지 확인하는 과정. 사용자명과 비밀번호를 통해 사용자를 식별
        • 권한 부여(Authorization)
          • 인증된 사용자가 수행할 수 있는 작업을 결정. 예시)ROLE에 따라 서비스 사용 구분
  • 세션 방식과 토큰 방식

    • 웹 애플리케이션에서 사용자 인증에 사용되는 대표적인 두가지 방법
    • 세션 방식
      • 세션이라는 용어는 클라이언트와 서버 간의 인증을 위해 유지되는 상태 정보를 저장하는 서버의 저장공간을 의미
      • 세션방식에서는 사용자가 로그인에 성공하면 서버에서 인증key + 인증정보를 http세션에 저장하고, 사용자에게 세션ID전달
      • 사용자는 세션ID를 받아 서버에 요청을 보낼때마다 세션ID를 쿠키와 함께 보내 검증을 요청
      • 쿠키
        • 쿠키는 웹사이트가 사용자의 웹 브라우저에 저장하는 작은 텍스트 파일
          • 대표적인 예시는 비밀번호 저장
          • “비밀번호를 저장하시겠습니까?” 등 쿠키파일로 id/pw가 웹브라우저에 저장
        • 세션방식에서는 쿠키에 검증값(세션ID)를 넣어 사용자에게 전달하는 세션ID를 담는 파일로 활용
    • 세션 방식 상세 절차
      • 사용자 로그인시 -> DB에서 로그인 정보 확인 -> 로그인정보가 맞다면, 서버에서 세션ID를 생성 및 세션ID를 쿠키파일로 전달 -> 서버 메모리에도 세션ID값을 저장(또는 캐싱DB) → 추후 사용자가 전달받은 쿠키파일을 서버에 http요청을 하게 되면, 메모리의 세션값과 비교하여 검증
      • 로그인 절차와 검증 절차
        • 로그인
          • id/pw를 입력하여 login시도
            • UserDetailsService에서 loadUserByUsername을 통해 DB에서 조회한 User객체 생성
          • AuthenticationProvider객체에서 사용자가 넣어온 id/pw와 DB에서 조회한 User객체와 비교 후 검증
          • 로그인 성공시에 Authentication객체에 사용자정보(email, role등)을 담고, 사용자에게 SESSIONID를 전달
        • 검증절차
          • 사용자는 api요청시에 쿠키에 sessionId를 담아 서버에 api요청
          • 서버에서는 session에 저장된 sessionId를 사용자가 요청한것과 비교하여 검증
    • 토큰 방식 (Token-Based Authentication)
      • 토큰 기반 인증 시스템의 구현체인 JWT(JSON Web Tokens)가 웹 표준으로 등록되어 있어, jwt 토큰방식이라 불림

        Untitled

      • 토큰 방식에서는 사용자가 로그인하면 서버는 사용자에게 인증 토큰을 생성하여 제공

      • 사용자는 이 토큰을 일반적으로 web browswer의 local storage에 저장하고 있다가 서버에 요청을 보낼 때마다 토큰을 함께 전송 검증을 요청

      • 서버에서는 사용자별 토큰과 인증정보를 별도로 저장하지 않고, 토큰을 secretkey로 재암호화 과정을 거쳐 사용자가 보내온 토큰 검증

      • 토큰방식 로그인 절차와 검증 절차

        • 로그인절차
          • id/pw를 입력하여 login시도 후에 서버에서 id/pw 검증하여 토큰 생성하여 전달
        • 검증 절차
          • 사용자는 api요청시에 header에 token을 넣어 서버에 api요청
          • 서버에서는 토큰을 별도로 저장하고 있지 않으므로, 요청시마다 해당 요청의 유효성 검증
          • 검증과 동시에 사용자 인증정보(email, role등)을 서버에 저장하기 위해 관련 정보를 Authentication객체에 저장
            • 이는 세션에 담는 반영구적인 저장이 아닌 요청마다의 일시적인 저장
  • 로그인 절차와 인증 관련 주요 객체

    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객체가 구현하여 유저객체를 리턴
  • Redis

    • Redis는 가장 간단한 형태의 키-값 형태의 비정형 Database (nosql)

    • 주요특징

      • 인메모리 데이터 구조 저장소로서 빠른 속도 보장.
      • 디스크에 주기적으로 저장하여 재시작 후에도 데이터 손실을 방지
    • 빠른 속도의 장점을 활용하여, 쿠키 또는 session값 등을 저장해두는 storage로 많이 사용

      Untitled