새소식

Spring

[Spring] Spring Security (Part.1) - 개념, 인증(Authentication), 권한 부여(Authorization)에 대한 설명 및 작동순서

  • -

 

 

Spring Security

 

 

 

 

1)  소개

 

① Spring Security의 개념

 

Spring 기반의 애플리케이션에서 보안인증에 관련된 작업을 쉽게 처리할 수 있도록 도와주는 강력한 보안 프레임워크

 

 

 

 

Spring Security의 역할

 

 

● 보안강화

인증되지 않은 사용자로부터 애플리케이션을 보호

→ 로그인이 필요할 경우, 인증을 거쳐야 접근할 수 있도록하여 데이터 유출, 남용 등으로부터 보호

 

● 인증 및 권한 부여

사용자가 제공한 자격증명(아이디 및 비밀번호)으로 신원을 확인하여 자격을 인증합니다.사용자가 인증되면 그에 맞는 권한을 부여합니다.인증방식은 폼 로그인, 소셜 로그인(OAuth), 기업용 로그인(SAML) 등 다양하게 지원합니다.

 

● 안티 패턴 방어

CSRF(Cross-Site Request Forgery) 공격 방어, 세션 관리, 비밀번호 암호화 등을 내장하고 있어서 개발자가 보안적인 실수를 최소화하도록 도와줍니다.

 

 

 

 

2)  사용자 인증 (Authentication)

 

① 개념

사용자 인증은 웹 애플리케이션에 접근하려는 사용자가 실제로 누구인지 확인하는 과정

사용자가 제공한 인증 수단(아이디, 패스워드, 토큰 등)을 검증하여 사용자의 신원을 확인하는 것으로 이루어집니다.

 

 

 

 

② 인증 방식

 

1) Form Login 방식

가장 일반적인 방식으로, 사용자가 아이디와 패스워드를 입력하여 로그인하는 방식입니다.

 

2) Social Login 방식

사용자가 다른 서비스의 인증 수단을 사용하여 로그인하는 방식

대표적으로 Google, Facebook, GitHub, 카카오 등이 있습니다.

 

3) OAuth 방식

사용자가 다른 애플리케이션의 인증 수단을 활용하여 웹 애플리케이션에 인증을 요청하는 개방형 표준 프로토콜

주로 API 접근 권한 부여에 사용됩니다.

 

4) JWT(Json Web Token) 방식

용자의 정보를 JSON 형식으로 표현한 토큰을 사용하여 인증하는 방식

토큰에 사용자 정보와 유효 기간 등의 정보를 포함합니다.

 

 

 

 

 

③ 인증 작동 순서

 

이미지 클릭시 확대됩니다

 

사용자가 로그인 폼에 아이디와 비밀번호를 입력하여 로그인을 시도합니다.

 

② UsernamePasswordAuthenticationFilter는 사용자로부터 받은 아이디와 비밀번호를 이용하여

    UserPasswordAuthenticationToken을 생성합니다.

 

UserPasswordAuthenticationToken을 AuthenticationManager에게 전달하여 인증을 요청합니다.

 

AuthenticationManager는 등록된 AuthenticationProvider들 중에서 적합한 Provider를 찾아서 인증을 시도합니다.

 

적합한 AuthenticationProvider는 UserDetailService를 사용하여 사용자 정보를 조회하고,

    입력받은 아이디와 비밀번호를 저장된 정보와 비교하여 인증을 처리합니다.

 

인증에 성공하면 AuthenticationProvider는 인증 객체(Authentication)를 생성하여 반환합니다.

 

반환된 인증 객체는 UsernamePasswordAuthenticationFilter로 돌아오고, 이를 SecurityContextHolder에 저장합니다.

 

SecurityContextHolder에 저장된 인증 객체는 사용자의 인증 상태를 나타내는 정보로서,

    이후 요청에서 사용자가 인증되었는지 여부를 확인하는 데 사용됩니다.

 

인증이 완료된 사용자는 권한 검사 등의 보안 처리를 거치며, 요청이 허용되는지 여부를 결정합니다.

 

 

 

 

※ 용어설명

● UserPasswordAuthenticationToken
사용자의 아이디와 비밀번호를 담고 있는 인증 토큰

 

UsernamePasswordAuthenticationFilter

사용자로부터 받은 아이디와 비밀번호로 UserPasswordAuthenticationToken 객체를 생성하고,

AuthenticationManager에게 인증을 요청합니다.

 

AuthenticationManager
인증(Authentication)을 수행하는 인터페이스

실제 인증을 처리하는 AuthenticationProvider들을 이용하여 인증을 시도합니다.

 

ProviderManager
ProviderManager는 실제 인증을 처리하는 AuthenticationProvider들을 관리하는 클래스입니다.

Authentication Provider:
AuthenticationProvider는 실제 인증을 처리하는 구현체

사용자 정보를 조회하여 인증을 시도하고, 입력받은 아이디와 비밀번호와 저장된 정보를 비교하여 인증을 처리함.

 

PasswordEncoder
PasswordEncoder는 보안을 강화하기 위해 사용자 비밀번호를 암호화하는 역할

 

UserDetailService
UserDetailService는 사용자 정보를 조회하는 인터페이스

사용자의 아이디를 기반으로 사용자 정보를 데이터베이스나 외부 시스템에서 가져옵니다.

 

● UserDetail

UserDetail은 인증에 필요한 사용자 정보를 담고 있는 객체

사용자의 아이디, 비밀번호, 권한 등의 정보를 포함합니다.

 

SecurityContextHolder
현재 실행 중인 스레드에 대한 SecurityContext를 제공하는 역할

SecurityContext는 사용자의 인증 정보와 권한 정보를 담고 있습니다.

인증이 성공시, 인증 객체(Authentication)를 SecurityContextHolder에 저장하여 사용자를 인증 상태로 관리합니다.

 

 

 

 

 

 

 

 

 

3)  권한 부여(Authorization)

 

 

① 개념

 

사용자의 인증(Authentication)이 성공한 후, 해당 사용자가 어떤 기능이나 권한이 있는지를 확인하는 과정을 의미합니다.

 

적절한 권한을 부여하고 권한을 제어하기 위함.

 

 

 

 

② 권한 부여 방식

 

1) Access Control List (ACL)

개별 사용자 또는 그룹마다 자원에 대한 접근 권한을 별도로 관리하는 방식

 즉, 각 자원마다 허용되는 사용자 또는 그룹을 명시하여 접근 권한을 설정

<예시>

파일(Money.pdf, Gold.pdf, Silver.pdf)이 있고, 사용자 그룹(Admin, Manager, User)가 있습니다.

Money.pdf에 Admin에게 읽기 및 쓰기 기능을 부여, Manager은 읽기 기능만 부여, User는 권한 없음.
Gold.pdf에  Admin은 모든 권한, Manager은 권한 없음, User는 읽기 가능

 

 

 

2) Role-Based Access Control (RBAC)

역할(Role)에 기반하여 사용자에게 권한을 부여하는 방식

사용자는 하나 이상의 역할을 가지며, 역할은 권한을 포함하고 있습니다.

사용자는 역할을 기반으로 권한을 상속하며, 사용자의 역할을 변경하여 권한을 제어할 수 있습니다.

 

<예시>

Admin: 모든 기능과 자원에 대한 접근 권한.
Manager: 사용자 관리와 리소스 관리에 대한 접근 권한.
User: 리소스에 대한 읽기 권한만 있고, 수정/삭제 권한은 없음.

 

철수에게 Admin 권한을 주면, 그 권한을 상속 받아 사용

영희에게 Manager 권한을 주면, 그 권한을 상속 받아 사용

 

 

 

 

③ 권한 부여 작동 순서

 

이미지 클릭시 확대됩니다

 

 

사용자가 인증된 상태로 요청을 보냅니다.

 

Security Filter Chain에 들어가기 시작합니다.

 

FilterInvocation 객체가 생성됩니다.

 

SecurityContextHolder에서 인증 객체(Authentication)를 가져옵니다.

 

⑤ 인증 객체에서 사용자의 권한 정보를 확인합니다.

 

Security Data Source에서 자원에 필요한 권한 정보(ConfigAttributes)를 가져옵니다.

 

AccessDecisionManager를 통해 권한 검사를 수행합니다.

 

⑧ AccessDecisionManager가 결정한 결과에 따라 접근이 허용되거나 거부됩니다.

 

 

 

※ 용어설명

 

Filter Chain
Spring Security의 모든 보안 필터는 Security Filter Chain에 속합니다.

보안 필터 체인은 여러 보안 필터들을 연결한 구조로, 요청이 보안 필터 체인을 순서대로 통과하며 작업을 수행합니다.

 

Authentication
Authentication 과정에서 생성된 인증 객체를 나타냅니다.

 

SecurityContextHolder
현재 실행 중인 스레드에 대한 SecurityContext를 제공하는 역할

SecurityContext는 인증 객체와 권한 정보를 담고 있습니다.

 

Filter Invocation
보안 필터 체인에서 요청이 보안 필터들을 순서대로 통과하면서 FilterInvocation 객체가 생성됩니다.

FilterInvocation은 Request과 Response를 포함하고 있으며, 필터 체인을 따라 요청을 처리하고 응답을 생성합니다.

 

Security Data Source
Security Data Source는 보안 관련 데이터를 제공하는 인터페이스

사용자의 권한 정보나 자원에 필요한 권한 정보를 데이터베이스나 외부 시스템에서 조회할 때 사용됩니다.

 

ConfigAttributes
ConfigAttributes는 자원에 대한 접근 권한을 표현하는 인터페이스

 

AccessDecisionManager
AccessDecisionManager는 접근 권한을 결정하는 인터페이스

사용자의 권한 정보와 자원에 필요한 권한 정보(ConfigAttributes)를 비교하여 접근이 허용되는지 여부를 결정합니다.

 

AccessDeniedException
사용자가 자원에 대한 접근 권한이 없을 때 발생하는 예외입니다.

 

권한을 갖지 않은 경우, AccessDeniedException이 발생하며, 일반적으로 접근 거부(403 Forbidden) 페이지로 처리됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2023.07.20 - [Spring] - [Spring] Spring Scheduler 이용하여 Slack 자동 알림 구현하기 (Slack 연동)

 

[Spring] Spring Scheduler 이용하여 Slack 자동 알림 구현하기 (Slack 연동)

SpringBoot + Slack 1. Slack Bot 생성하기 https://api.slack.com/ Slack은 생산성 플랫폼입니다 Slack은 팀과 커뮤니케이션할 수 있는 새로운 방법입니다. 이메일보다 빠르고, 더 조직적이며, 훨씬 안전합니다. sl

devwarriorjungi.tistory.com

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.