Async를 왜 사용하는지 부터 확인을 해봐야한다.
우리는 왜 굳이 비동기 프로그램을 사용하게 되는것 일까??
동기와 비동기의 가장큰 차이는 처리의 순서가 있냐 없냐 정도라고 생각한다.
즉, 동기의 경우 먼저 처리되고있는 요청이 느려지는 순간 다음으로 처리되어야 하는 요청들도
막힌 1차로 도로처럼 밀리게 되어있다.
하지만 비동기의 경우 1차로가 아닌 4차로 5차로로 길을 터준다고 생각 하면 된다.
여기서 차로를 쓰래드로 생각하면 조금더 프로그래밍 적으로 이해하기 쉬울 것같다.
즉, 쉽게 생각하면 멀티쓰래드를 통한 효율적인 일 처리라고 생각하면 된다.
사용 하는 기본적인 셋팅.
@Async 어노테이션
@EnableAsync + TreadPool 설정(안할시 디폴트값으로 설정)




우리가 /tests 로 요청을 보냈을 때.

이렇게 SecurityLogger라는 class에 정의된 log메소드에 따라서
Treand location과 pricipal 정보가 출력된다.
여기서 Async가 설정된 asyncService() 메소드에 집중을 해보면
Thread Location : task-1 으로 변경 되어있다 . 즉 다른 쓰래드를 사용한다는 증거인데
문제는 principle 정보가 출력되지 않았다.
nullPointerException 이 발생되었댜...

왜째서 그럴까?
주의점
서로 다른 쓰래드를 사용함에 있어 인증정보를 사용하지 못한다. 기본적으로
즉, SecurityContextHolder에 set한 principal 정보를 가져오지 못한다는 것이다.
이는 SecurityContextHolder의 전략에서 오는 문제인데 . SecurityContextHolder의 기본 전략은
LocalThread이다. 즉, 같은 쓰래드 안에서만 공유가 되는 것인데. 이를

이렇게 모드를 바꾸어 주면 공유가 가능하다. 왜냐하면 원래의 쓰래드로부터 파생된 쓰래드가 task-1 이기 떄문.

수정후 요청을 보내면 다른 Tread Location 이 나오고 있지만 Principle 정보를 정상적으로 가져오는것을 확인 할수 있다.
| Spring Security [CSRF ATTACK] (0) | 2022.07.27 |
|---|---|
| SpringSecurity [SecuriyContextPersistenceFilter] (0) | 2022.07.27 |
| SpringSecurity [WebAsyncManagerIntegrationFilter] (0) | 2022.07.15 |
| SpringSecurity [JwtBuilder] (0) | 2022.07.06 |
| SpringSecurity [JWT 메소드 구경하기] (0) | 2022.07.06 |
댓글 영역