프로젝트/프로젝트 관련

Spring Security 구현방식

Wonuk 2022. 1. 24. 01:41
반응형
본 포스팅은 단순 기록용 포스팅입니다.
학습 자료가 필요하신분은 하단의 링크를 이용해주시면 됩니다.

https://wonuk.tistory.com/156

 

Spring Security란?

Spring Security란? '인증'과 '인가'를 제공하는것에 초점을 맞춘 프레임워크 입니다. 이전 포스팅 링크 https://wonuk.tistory.com/154?category=1025481 인증(Authentication)과 인가(Authorization)란 무엇인가..

wonuk.tistory.com


개요

Spring Security

스프링 기반의 어플리케이션의 보안을 담당하는 프레임워크

 

스프링 시큐리티의 역할

1. 인증(Authenticatio) : 애플리케이션의 작업을 실행할 수 있는 주체

2. 인가(Authorization) : 인증된 주체가 특정 작업을 실행할 수 있는 권한을 가졌는지를 결정

 

특징

스프링 시큐리티는 보안과 관련해 많은 옵션들을 지원합니다.

스프링 시큐리티는 Spring과 분리되어 filter 기반으로 동작합니다.

스프링 시큐리티는 서블릿필터 체인을 자동으로 구성하고

요청을 거치게 합니다.

 

 

적용

스프링 시큐리티는 세션 - 쿠키 방식으로 인증합니다.

1. 요청을 받아 DB에 검증된 회원일 경우, JSESSIONID를 부여합니다.

2. 이 후 요청에서 JSESSIONID을 검증 후 유효하면 인증됩니다.

JSESSIONID는 암호화되어 저장됩니다.

 

요구사항

어떤 사용자인지 구분하기 위해서는 HTTP Header 중

Authorization 의 Value Prefix 에 따라 구분되어야 합니다.

ex ) curl -H "Authentication: Realtor 47"

 

Authorization 헤더는 JWT, Bearer, Basic등 암호화된 토큰을 

서버로 보낼 때 사용하는 헤더입니다.

하지만 요구사항의 Realtor 47는 암호화되지 않은 데이터입니다.

그래서 기존의 JWT, Bearer, Basic 방법을 사용하지 않고

Cookie 헤더에 Realtor_47 형식으로 저장하도록 만들었습니다.

언더바가 사용된 이유
Realtor 47 형식으로 Cookie에 데이터를 저장하고자 한다면
Realtor%2047 형식으로 저장되게 됩니다.
따라서 언더바를 구분자로 활용하고자 하였습니다.

이렇게 만들어진 Cookie를 활용하여 클라이언트 측에서

Authorization 헤더에 Realtor 47 형식으로 값을 전달할 수 있게됩니다.

 

구현방식

메소드 호출 흐름

  • Http Request Authorization 헤더로 인증관련 값이 전달됩니다. -> 그림의 1번
  • AuthenticationFilter에서 customTokenProvider에 값을 전달합니다. -> 2번
  • MemberUserDetailsService 에서 loadUserByUsername
    메소드를 통해 UserDetails를 획득합니다. -> 3, 4, 5, 6, 7번
  • UserDetails를 활용해 UsernamePasswordAuthenticationToken를 생성하고
    AuthenticationFilter로 전달합니다. -> 8, 9번
  • 생성된 Token을 AuthenticationFilter에서 SecurityContext의
    setAuthentication메소드를 사용하여 저장합니다. -> 10번

 

AuthenticationManager 흐름 [그림의 3, 4, 5, 6, 7]

요청에 담긴 Authorization 헤더를

-> AuthenticationManager에 전달합니다.

-> AuthenticationManager를 구현한 ProviderManager가 이를 처리합니다.

-> AuthenticationManager가 AuthenticationProvider를 통해

-> UserDetailsService를 거쳐 인증을 합니다.

-> 마지막으로 UserDetails에 Member를 등록합니다.

 

 

 

 

 

 

 

반응형