북 스터디/스프링 부트 핵심가이드

서비스의 인증과 권한 부여

EnoughTT 2023. 4. 30. 17:59

보안 용어 이해

인증 (Authentication)

사용자가 누구인지 확인하는 단계
ex) 로그인
      로그인에 성공하면 애플리케이션 서버는 응답으로 사용자에게 토큰 (token)을 전달
      실패한 사용자는 토큰을 전달받지 못해 원하는 리소스에 접근 불가

 

인가 (Authorization)

검증된 사용자가 애플리케이션 내부의 리소스에 접근할 때, 해당 리소스에 접근할 권리가 있는지 확인
ex) 특정 게시판
      게시판 접근 등급을 확인해 접근을 허가하거나 거부

 

접근 주체 (Principal)

애플리케이션 기능을 사용하는 주체
ex) 사용자 또는 디바이스, 시스템

 

스프링 시큐리티 동작 구조

서블릿 필터 (Servlet Filter) 기반 동작, DispatcherServlet 앞에 필터 배치

 

서블릿 필터의 배치

필터체인 (FilterChain) 은 서블릿 컨테이너에서 관리하는 ApplicationFilterChain 을 의미

클라이언트 → 서블릿 컨테이너 (URI 확인) → 필터와 서블릿 매핑

스프링 시큐리티는 사용하고자 하는 필터체인을 서블릿 컨테이너의 필터 사이에서 동작시키기 위해 DelegatingFilterProxy 사용

 

DelegatingFilterProxy 는 서블릿 컨테이너의 생명주기와 스프링 애플리케이션 컨텍스트 (Application Context) 사이에서 다리 역할을 수행하는 필터 구현체

표준 서블릿 필터를 구현, 역할 위임할 필터체인 프록시 (FilterChainProxy) 를 가지고 있음

필터체인 프록시는 스프링 부트의 자동 설정에 의해 자동생성됨

 

필터체인 프록시 (FilterChainProxy)

스프링 시큐리티에서 제공하는 필터, 보안 필터체인 (SecurityFilterChain) 을 통해 많은 보안필터를 사용할 수 있음

List 형식으로 담을 수 있게 설정돼 있어 URI 패턴에 따라 특정 보안필터 체인을 선택 사용, 각 필터마다 실행되는 순서가 다름

 

보안 필터체인 (SecurityFilterChain)

WebSecurityConfigurerAdapter 클래스를 상속받아 설정

여러 보안 필터체인을 만들기 위해서는 상속받는 클래스를 여러 개 생성하면 됨

@Order 어노테이션을 통해 순서를 정의하는 것이 중요

 

인증 과정

 

JWT

JWT (JSON Web Token)
당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰
URL로 이용할 수 있는 문자열로만 구성돼 있으며, 디지털 서명이 적용돼 있어 신뢰할 수 있음
주로 서버와의 통신에서 권한 인가를 위해 사용
URL에서 사용할 수 있는 문자열로만 구성돼 있기 때문에 HTTP 구성요소 어디든 위치 할 수 있음

 

JWT 구조

점( . ) 으로 구분된 아래의 세부분으로 구성

  • 헤더 (Header)
  • 내용 (Payload)
  • 서명 (Signature)

JWT 구조

JWT 헤더

검증과 관련된 내용, Base64Url 형식으로 인코딩돼 사용

  • alg
    • 해싱 알고리즘 지정
    • SHA256 또는 RSA 사용
    • 토큰 검증시 서명부분에서 사용
  • typ
    • 토큰의 타입 지정

JWT 내용

토큰에 담는 정보를 포함, 속성들은 클레임 (Claim)

  • 등록된 클레임 (Registered Claims)
    • 필수 아님
    • iss : 발급자의 주체, 문자열이나 URI를 포함하는 대소문자를 구분하는 문자열
    • sub : 제목 (subject)
    • aud : 수신인, 해당 값으로 자신을 식별해야함
    • exp : 만료기간 (Expiration), 시간은 NumericDate 형식으로 지정
    • nbf : "Not Before" 를 의미
    • iat : 발급된 시간 (Issued at)
    • jti : 식별자 (JWT ID), 중복 처리 방지
  • 공개 클레임 (Public Claims)
    • 키 값을 마음대로 정의 할 수 있음
    • 충돌이 발생하지 않을 이름으로 설정
  • 비공개 클레임 (Private Claims)
    • 통신 간 상호 합의되고 등록 클레임과 공개 클레임을 의미

JWT 서명

인코딩된 헤더, 인코딩 된 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성

토큰의 값들을 포함해서 암호화하기 때문에 메시지가 도중에 변경되지 않았는지 확인할 때 사용


아직 JWT 와 세션의 차이나 면접에서 JWT에 관해 물어본다면 답을 못하는 수준이다.

몇주전 오카방에서 JWT에 관한 질문이 던져졌는데 그 질문에 답을 할 수 있게끔 공부를 해두어야 할 것이다.

'북 스터디 > 스프링 부트 핵심가이드' 카테고리의 다른 글

액추에이터 & 서버 간 통신  (0) 2023.04.23
유효성 검사와 예외처리  (0) 2023.04.16
연관관계 매핑  (0) 2023.04.09
Spring Data JPA  (0) 2023.04.01
데이터베이스 연동 - 2  (0) 2023.03.26