본문 바로가기
Back end/Spring

[Spring] Security,JWT

by 더 이프 2023. 8. 11.
728x90

목차

    1. Security

    ■ Security란?

    Spring Security는 Spring 기반의 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크입니다. Security는 인증과 권한에 대한 부분을 필터의 흐름에 따라 처리하고 있습니다. 필터는 Dispatcher Servlet으로 가기 전에 적용되므로 가장 먼저 URL 요청을 받습니다. Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서 보안관련 로직을 작성하지 않아도 됩니다. Security는 기본적으로 인증 절차를 거친 후에 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지 확인을 합니다. 인증 절차는 해당 사용자가 본인이 맞는지를 확인하는 것이며, 인가 절차는 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차입니다.

    ■ 설치

    • MVN에서 Security를 버전에 상관없이 설치 후 dependency에서 버전을 지운 뒤 설치
      Spring Security Installation

    ■ 구조

    Spring Security Structure

    1. SecurityContextHolder

    • SecurityContextHolder는 보안 주체의 세부 정보를 포함하여 응용프로그램의 현재 보안 컨텍스트에 대한 세부 정보가 저장

    2.  SecutiryContext

    • Authentication을 보관하는 역할을 하며 SecurityContext를 통해 Authentication을 꺼내는게 가능

    3. Authentication

    • Authentication는 현재 접근하는 주체의 정보와 권한을 담는 인터페이스
    • Authentication 객체는 SecurityContext에 저장

    4. UsernamePasswordAuthenticationToken

    • UsernamePasswordAuthenticationToken은 Authentication을 implements한 AbstractAuthenticationToken의 하위클래스
    • username이 Principal 역할을 하고, password가 Credential의 열할
    • 첫번째 생성자는 인증 전의 객체 생성, 두번째 생성자는 인증이 완료된 객체를 생성

    5. AuthenticationManager

    • 인증에 대한 부분은 AuthenticationManager를 통해서 처리
    • 인증이 성공하면 두번째 생성자를 이용해 인증이 성공한 객체를 생성하여 SecurityContext에 저장

    6. UserDetails

    >

    • 인증에 성공하여 생성된 UserDetails 객체는 Authentication 객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용

    7. UserDetailsService

    • UserDetailsService인터페이스는 UserDetails 객체를 반환하는 단 하나의 메소드를 가짐
    • 일반적으로 이를 구현한 클래스 내부에 UserRepository를 주입받아 DB와 연결하여 처리

     

    2. JWT

    ■ JWT란?

    JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 JSON토큰을 의미합니다. JWT 기반 인증은 JWT토큰을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방법입니다. 토큰 내부에는 위변조 방지를 위한 개인키를 통한 전자서명도 들어있습니다. 따라서 사용자가 JWT를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려줍니다.

    ■ 설치

    • JWT를 사용하기 위해 아래와 같이 API, Impl, Jackson 세가지를 최신 버전으로 설치
      JWT Installation

    ■ 구조

    • JWT는 .을 구분자로 나누어지는 세가지 문자열의 조합이며 Header.Payload.Signature를 의미
    • Header에는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 존재
    • Payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 존재
    • Signature는 Header, Payload를 Base64 URL -safe Encode를 한 이후 Header에 명시된 해시함수를 적용하고, 개인키로 서명한 전자서명이 존재
      JWT Structure