본문 바로가기
Spring

spring security란

by devjh 2021. 3. 31.
반응형

이번 게시글에서는 spring security에 대해 알아보겠습니다.

 

 

1. 스프링 시큐리티란?

스프링 시큐리티란 인증, 인가를 담당하는 프레임워크입니다. Interceptor단이나, aop를 만들어 session을 직접 확인한 후 인증, 인가를 처리하는 경우도 있지만 스프링 시큐리티에서는 해당 작업을 편리하게 할 수 있도록 지원해줍니다.

 

 

2. 스프링 시큐리티 특징

  • filter 기반으로 동작합니다.(체인방식으로 여러개 추가 가능)
  • 어노테이션을 통해 간단한 설정이 가능합니다
  • 기본적으로는 세션 & 쿠키방식으로 인증됩니다.
  • dispatcher servlet 이전에 처리됩니다.

 

3. 스프링 시큐리티 용어

  • Authenticate(인증) : 현재 유저가 누구인지 확인
  • Authorize(인가) : 현재 유저가 요청한 자원에 접근 가능한지를 확인
  • Principal(접근 주체) : 자원에 접근하는 유저
  • Credential(비밀번호) : 자원에 접근하는 대상의 비밀번호

 

4. 스프링 시큐리티 architecture

스프링 시큐리티의 큰 로직은 다음과 같습니다.

 

1. 로그인요청

2. AuthenticationFilter에서 UsernamePasswordAuthenticationToken을 생성, AuthenticaionManager에게 전달

3. Manager는 등록된 AuthenticationProvider를 통해 사용자 정보를 조회

4. password가 일치한다면 Manager는 UsernameAuthenticationToken을 filter에게 전달

5. AuthenticationFilter는 UsernameAuthenticationToken를 SecurityContextHolder에 Authentication내부에 저장

 

큰 그림은 필터와 매니저 프로바이더 끼리 Authentication의 구현체인 token을 주고받으며 인증을 진행합니다.

 

5. 스프링 시큐리티 filter

스프링 시큐리티의 filter는 매우 많지만

Authentication 객체를 제공하는 대표적인 필터는 다음과 같습니다.

  • UsernamePasswordAuthenticationFilter
    • (form 로그인 -> Authentication의 구현체인 UsernamePasswordAuthenticationToken을 사용)
  • BasicAuthenticationFilter 
    • (ajax 로그인 -> Authentication의 구현체인 UsernamePasswordAuthenticationToken 사용,
    • 헤더에 Basic 토큰값을 넣거나 encoding한 값을 넣어 로그인처리)
  • BearerTokenAuthenticationFilter (JWT 로그인)
  • OAuth2LoginAuthenticationFilter (소셜 로그인)

이번 게시글에서는 가장 마지막단인 Authentication 객체를 살펴보겠습니다.

 

6. 스프링 시큐리티에서의 인증이란?

SecurityContextHolder.SecurityContext.Authentication 객체의

멤버인 authenticated 가 true가 된 상태를 말합니다.

 

 

7. Authentication

package com.example.securitytut.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @GetMapping("/auth")
    public Authentication auth() {
        return SecurityContextHolder.getContext().getAuthentication();
    }
}

spring security 의존성을 추가한 뒤 위와 같은 컨트롤러를 만들어봤습니다.

 

리턴하는 Type은 Authentication이며

 

해당 객체는 SecurityContextHolder내부의 securityContext 내부에 존재합니다.

 

결과를 확인해보겠습니다.

 

 

8. 결과

{
    "authorities": [
        {
            "authority": "ROLE_ANONYMOUS"
        }
    ],
    "details": {
        "remoteAddress": "0:0:0:0:0:0:0:1",
        "sessionId": null
    },
    "authenticated": true,
    "principal": "anonymousUser",
    "keyHash": -214340502,
    "credentials": "",
    "name": "anonymousUser"
}

Authentication 인터페이스는 다음과 같은 정보를 갖고있습니다.(토큰을 부여할대 해당 내용이 들어가야합니다.)

  • authorities 인증된 권한 정보
  • details 그밖에 필요한 정보
  • authenticated : 인증여부
  • principal 인증 대상에 관한 정보(UserDetails객체가 주로 옵니다.)
  • credentials 인증확인을 위한 정보

따로 인증로직을 만들지 않았으므로

인증이 성공한 상태이므로 authenticated가 true가 된 것을 확인 할 수 있습니다.

반응형

댓글