본문 바로가기
백엔드/Spring Security

Spring Security 구조와 내부

by 임지혁코딩 2024. 1. 11.

내부 구조란 ?

SecurityContextHolder 안에, SecurityContext 안에 Authentication 안에 Principal과 GrantAuthority가 있는 구조

 

SecurityContextHolder는 SecurityContext를 제공, 해당 메소드를 지원 .

 

SecurityContext는 접근 주체와 인증에 대한 정보, 즉 인증을 담고 있다 .

 

Authentication에는 인증 이후 해당 인증을 저장. 

 

Principal은 User의 정보를 제공한다. 대부분 Principal로 userdetails를 반환 

 

GrantAuthority는 User의 Role을 붙인다.

주로 ROLE_USER,ROLE_ADMIN등을 사용. 인가에서 사용한다 . 

2개의 권한을 동시에 가질 수 있다. (COLLECTION 형태로)

 

Debug를 활용해서 확인한 예시 : securityContext안에 authentication 안에 principal과 기타 정보들에 대한 형태로 이루어져 있음을 직접 확인할 수 있었다.

 

securitycontext안에 인증에 대한 pw정보는 authentication에, principal엔 user의 정보가 작성됨을 볼 수 있었다. 

 

이를 확인했던 코드는

SecurityContext securityContext = SecurityContextHolder.getContext();

이와 같다. 어떤 user인지도 모르는데 어떻게 정확한 user의 securityContext를 가져왔을까?

 

ThreadLocal의 사용 덕이다. 

webmvc는 1개의 요청당 1개의 쓰레드 를 생성시킨다.  (쓰레드는 프로세스 내에서 실제 작업의 단위)

이에 1대1 대응으로 SecurityContext를 생성시킨다.

즉 1개의 요청 : 1개의 Thread: 1개의 SecurityContext를 사용하게끔 하는 방식을 ThreadLocal이라고 한다.

SecurityContextHolder가, 내부적으로 threadlocal을 사용한다. 추가적인 선언은 필요하지 않다. 

 

 

PasswordEncoder

 

비밀번호를 encoding하는 것 

1. PW의 암호화 저장 2.해당 PW의 회원가입과 로그인 PW를 비교할 수 있어야 한다.

다만 ! 복호화 할 필요가 없다. 하여 일방향 성질을 가지는 HASH를 사용한다

 

1. pw를 해시 -> 2. 로그인시 pw도 해시 -> 3. 이 값을 비교하여 ->4. 둘이 일치한지를 확인 

 

**SpringSecurity 6에서부터 PasswordEncoder의 설정이 변경됨에 유의하자 . 

 

주로 Bcrypt를 사용했지만, sha256을 사용하는 StandardPasswordEncoder등도 사용할수 있다. 

Bcrpyt는 패스워드 저장만을 목적으로 설계되어있다. 

 

'백엔드 > Spring Security' 카테고리의 다른 글

Spring Security Config  (0) 2024.01.11
Spring Security의 핵심 , SECURITY Filter  (1) 2024.01.11
SPRING SECURITY란?  (0) 2024.01.08