인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

DYB님의 프로필 이미지
DYB

작성한 질문수

Spring Boot JWT Tutorial

DTO, Repository, 로그인

SecurityContextHolder.getContext().setAuthentication(authentication);

작성

·

490

1

안녕하세요 

SecurityContextHolder.getContext().setAuthentication(authentication);

이게 doFilter에도 있고 로그인할 때도 있는데 이 둘의 차이가 뭔가요??

예를 들어 특정 사용자의 토큰을 프론트에서 넘겨줄 때 토큰에 들어있는 정보를 가져와서 그것을 이용해서 데이터베이스에서 사용자 조회를 사고 그 사용자 정보를 바탕으로 특정작업을 처리할 때 

SecurityContextHolder.getContext().getAuthentication().getName(); 이런 식으로 처리하는 것으로 아는데 이렇게 가져오는 건 어디서 저장되어있는 것을 가져오는 건가요?? session방식이 아니기 때문에 서버에 저장하는 것 같지는 않은데요,..

답변 2

1

정은구님의 프로필 이미지
정은구
지식공유자

안녕하세요 답변이 늦어 죄송합니다.

doFilter에서 setAuthentication 하는 부분은 헤더에 토큰이 있는 경우이고, 

로그인 요청 시 에는 헤더에 토큰이 없기 때문에 doFilter에서는 해당 부분을 수행하지 않고

setAuthentication 하는 부분은 로그인 생성 후에 토큰을 스레드 내 인증정보의 저장소 역할을 하는 SecurityContextHolder에 저장하고 사용하게 됩니다.

 

쉽게 풀어서 설명드리자면

Spring으로 요청이 들어왔을때 헤더의 인증정보를 스레드 내 저장소에 담아놓고 해당 스레드에서 필요 시 꺼내서 사용한다고 이해하시면 될 것 같습니다.

 

0

로그인할 때 setAuthentication 하는 이유가 먼가요?
어차피 세션이 stateless 인데, 로그인은 그냥 토큰만 주면 끝나는 거고, setAuthentication 할 필요가 없지 않나요? 로그인 뒤에 헤더에 토큰 달고 오는 요청은 doFilter 에서 setAuthentication 되니까요

저도 궁금해서 생각해봤는데

프론트쪽이 있을때

만약 시작페이지에 로그인이 있고 그 구역이 비동기로 동작한다면

로그인을 하게되면 "누구누구님 환영합니다" 이러한 문구가 필요한 부분에서 사용되지 않을까요??

로그인 즉시 필요한 곳에서 사용될거 같은데

 

잘모르지만 답변남겨봅니다..

DYB님의 프로필 이미지
DYB

작성한 질문수

질문하기