내부 구조란 ?
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 |