• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

spring oauth2 질문드립니다.

18.08.19 01:45 작성 조회수 531

0

수업 내용에는 없는 질문드리는거 같아서 죄송합니다. 어디 검색해봐도 정확한 개념을 알기 어려우서 이렇게 질문드립니다.

기존 로그인 방식은 정통적인 쿠키 세션 방식에서 spring security OAuth2 기반으로 인증 시스템을 구현하려고 합니다.

첫 번째 질문

OAuth2 Token 기반으로 가면 JSESSIONID를 사용할 필요가 없나요? 프런트에서는 access token 남 넘겨주면 될 거 같아서요

두 번째 질문

로드벨런싱 문제 입니다. 토큰은 데이터베이스(Redis를 사용할거 같습니다.)에 저장 돼 있으니 어느 서버에 요청이 들어와도 유효한 토큰인지 아닌지 판단하는 것은 아주 어려움이 없어 보입니다.

하지만 role 검사는 어떻게 진행되는 걸까요?

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

....

}

스프링 시큐리티를 구현시 loadUseByUsername 메서드를 통해서 UserDetails 를 리턴 해주고 이때 getAuthorities도 세션 정보에 저장이 되는걸로 알고 있습니다.

여기서 문제가 있다고 생각되는 부분이 세션 정보에 저장되다 보니 로드밸런싱된 환경에서 문제가 있을 거 같습니다. 이렇게 세션에 저장되 있는 Authorities 들은 어떻게 해결 해야할까요?

저는 최대한 데이터베이스에 저장하고 로드밸런싱 환경에 크게 신경을 쓰지 않게 구현하고 싶습니다.

진심으로 항상 좋은 컨텐츠 감사합니다.

답변 1

답변을 작성해보세요.

0

이 질문을 너무 늦게 봤네요. 무려 두달 전에 하셨었군요. 에고 늦어서 죄송합니다.

음.. 스프링 시큐리티가 어렵죠. 우선 첫번째 질문에 대한 답으로는 JSESSIONID는 서버에서 세션을 만들지 않으면 생기지 않습니다. request.getSession(false)를 하거나, 스프링 시큐리티에 무슨 설정이 있던걸로 기억하는데, 세션을 안쓰기로 결정하면 세션이 안생기고 그럼 JSESSIONID라는 쿠키가 null이 되죠. 완전히 토큰 기반으로 Stateless 서버를 구현할 거라면 그래도 상관없습니다. 하지만 인증이 아니라 다른 이유에서 쿠키나 세션이 필요하다면 써야겠지요?

두번째 질문에 그 role에 대한 정보가 저기서 리턴하는 UserDetails에 같이 들어갑니다. 저기서 리턴한 그 UserDetils는 SecurityContext라는 걸로 다시 감싸서 SecurityContextHodler를 통해 접근할 수 있는데요. 그 SecurityContextHodler는 기본적으로 HTTP 세션이 아니라, ThreadLocal을 사용해서 SecurityContext를 저장해 두고 제공하고 있죠. 여기서 ThreadLocal은 자바나 C# 이나 어느 언어에 보통 있는거 같은데, 동일한 쓰레드 내에서 데이터를 공유하는 방법으로 쓰입니다. (ThreadLocal이 생소하시다면 그 부분에 대해서는 조금 학습해 보시는게 좋습니다.)

따라서 두번째 문제는 걱정하지 않으셔도 될거 같습니다.