JWT 토큰으로 로그인 유지하기

지니🧸·2023년 3월 3일
0

삽질 저장소

목록 보기
6/16

JWT를 사용하는데 세션을 구현하는 건 쓸데 없는 짓입니다. 검색을 통해 이 글에 도달하셨다면 JWT를 다시 이해해보세요.. 저도 삽질이였습니다

JWT 토큰으로 세션을 대체하니까 유저가 로그인해도 바로 다음 리퀘스트에 로그아웃이 되어버리는 불상사 발생. 너무 많은 깃헙과 스택오버플로우를 훔쳐봐서 어디서 가져온건지도 잘 모르겠지만..

public class DelegatingSecurityContextRepository implements SecurityContextRepository {

    private final List<SecurityContextRepository> delegates;

    public DelegatingSecurityContextRepository(SecurityContextRepository... delegates) {
        this(Arrays.asList(delegates));
    }

    public DelegatingSecurityContextRepository(List<SecurityContextRepository> delegates) {
        Assert.notEmpty(delegates, "delegates cannot be empty");
        this.delegates = delegates;
    }

    @Override
    public SecurityContext loadContext(HttpRequestResponseHolder requestResponseHolder) {
        SecurityContext result = null;
        for (SecurityContextRepository delegate : this.delegates) {
            SecurityContext delegateResult = delegate.loadContext(requestResponseHolder);
            if (result == null || delegate.containsContext(requestResponseHolder.getRequest())) {
                result = delegateResult;
            }
        }
        return result;
    }

    @Override
    public void saveContext(SecurityContext context, HttpServletRequest request, HttpServletResponse response) {
        for (SecurityContextRepository delegate : this.delegates) {
            delegate.saveContext(context, request, response);
        }
    }

    @Override
    public boolean containsContext(HttpServletRequest request) {
        for (SecurityContextRepository delegate : this.delegates) {
            if (delegate.containsContext(request)) {
                return true;
            }
        }
        return false;
    }
}

그대로 SecurityConfig에 적용

public class SecurityConfig {
	...
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.cors().and()
                .csrf().disable()
                ...
                .and()
                .securityContext((securityContext) -> securityContext
                        .securityContextRepository(new DelegatingSecurityContextRepository(
                                new RequestAttributeSecurityContextRepository(),
                                new HttpSessionSecurityContextRepository()
                        ))
                );
		...

        return http.build();
    }
}
profile
우당탕탕

0개의 댓글