PLOD

[Spring] Spring Security 본문

개발 공부/Spring framework

[Spring] Spring Security

훌룽이 2024. 7. 25. 13:54

 인증과 인가

  • 인증(Authentication)
    1. 인증은 해당 유저가 실제 유저인지 인증하는 개념
    2. 해당 리소스에 대해서 작업을 수행할 수 있는 주체인지 확인하는 것
  • 인가(Authorization)
    1. 해당 유저가 특정 리소스에 접근이 가능한 지 허가를 확인하는 개념
    2. 인증 과정 이후에 일어나는 확인 과정

filter

  • Filter란 Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치이며 이를 통해 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가할 수 있다
  • 주로 범용적으로 처리해야 하는 작업들(ex. 인증 , 인가와 같은 보안처리)에 활용
  • 로직을 비즈니스 로직과 분리하여 관리 할 수 있다는 장점

Spring Security

Spring Security는 Spring 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해 준다.

  1. Filter chain

 

  • Spring에서 모든 호출은 DispatcherServlet을 통과하게 되고 이후에 각 요청을 담당하는 Controller로 분배
  • 이 떄, 각 요청에 대해서 공통적으로 처리해야 할 필요가 있을 때 DispatcherServlet 이전에 단계가 필요하며 이것이 Filter라고 한다. 
  • Spring security도 인증 및 인가를 처리하기 위헤 FilterChainProxy를 통해서 상세 로직 필터를 구현하고 있다. 

2. Form Login 기반 인증

Form Login 기반 인증은 인증이 필요한 URL 요청이 들어왔을 때 인증이 되지 않았다면 로그인 페이지를 반환하는 형태

3. UsernamePasswordAuthenticationFilter

4. SecurityContextHolder

5. Authentication

6. UserDetailsService

7. UserDetails

JWT(Json Web Token)

 

JWT란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Clain 기반의 Web Token 이다.

(JSON = 토큰의 한종류)

대용량 트래픽 처리를 위해 서버가 2대 이상 운영이 필요할 때가 있는데 Session 마다 다른 Client 로그인 정보를 가지고 있을 수 있다. 그렇게 되면 로그인 정보를 가지고 있는 Server 이외에 다른 서버들에게 로그인을 요청했을 때 문제가 생기지 않을까?

이러한 문제를 해결하기 위해 Session storage를 생성하여 모든 서버에 로그인 정보를 공유할 수 있도록 한다. session storage 방식으로 secret key를 JSON 방식의 토큰을 사용하는 것이 JWT의 개념이다.

 

  1. 장점
    • 동시 접속자가 많을 때 서버 측 부하 낮춤
    • Client, Sever 가 다른 도메인을 사용할 때
      • 예) 카카오 OAuth2 로그인 시 JWT Token 사용
  2. 단점
    • 구현의 복잡도 증가
    • JWT 에 담는 내용이 커질 수록 네트워크 비용 증가 (클라이언트 → 서버)
    • 기 생성된 JWT 를 일부만 만료시킬 방법이 없음
    • Secret key 유출 시 JWT 조작 가능

JWT 사용 흐름

  • Client 가 로그인 정보(ex . username, password) 로 로그인 성공 시
    1. 서버에서 "로그인 정보" → JWT(Json Web Token) 로 암호화 (Secret Key 사용)
    2. JWT 를 Client 응답 Header에 전달
    3. 응답 Header 에 아래 형태로 JWT 전달
Authorization: Bearer <JWT>

ex)
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzcGFydGEiLCJVU0VSTkFNRSI6IuultO2DhOydtCIsIlVTRVJfUk9MRSI6IlJPTEVfVVNFUiIsIkVYUCI6MTYxODU1Mzg5OH0.9WTrWxCWx3YvaKZG14khp21fjkU1VjZV4e9VEf05Hok
  • Client 에서 JWT 통해 인증방법
    • JWT 를 API 요청 시마다 Header 에 포함
Content-Type: application/json
Authorization: Bearer <JWT>
...
  • Server
    1. Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용)
    2. JWT 유효기간이 지나지 않았는지 검증
    3. 검증 성공시, JWT → 에서 사용자 정보를 가져와 확인
Authorization: Bearer <JWT>

ex)
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzcGFydGEiLCJVU0VSTkFNRSI6IuultO2DhOydtCIsIlVTRVJfUk9MRSI6IlJPTEVfVVNFUiIsIkVYUCI6MTYxODU1Mzg5OH0.9WTrWxCWx3YvaKZG14khp21fjkU1VjZV4e9VEf05Hok
Comments