[Spring] A & A (JWT, Security)

SW Development
[스프링] 인증 및 인가 (JWT, Security)
Posted on Aug. 8, 2024, 3:25 p.m. by SANGJIN
random_image

When developing with the Java Spring framework, I have summarized key terms related to JWT, which is commonly used for implementing login functionality.

JWT (JSON Web Token)

  • A claim-based web token that stores user attributes using JSON format. It is primarily used as a cookie value for authentication and authorization in web applications. It is created by encrypting user information based on user login at the server and then sent in the client response. The client stores it as a cookie, and during API requests, the server verifies the JWT to perform authentication or authorization.

Token vs. Session

  • Token: Stored on the client (web browser), state control is not possible, security is vulnerable (cookie information exposure), less server load, and flexible (e.g., OAuth2).

  • Session: Stored on the server, state control is possible (forced logout), statefully secure, easy to implement but higher load as the number of services (instances) increases.

Spring JWT-based Authentication and Authorization Process

  • Sign Up: Register user information such as ID, password, and user roles.

  • Login: After checking user information, if the user is registered, generate a JWT and respond. API Request (URL Request): In the filter, verify the JWT if authentication or authorization is required for the accessed page.

    • *Filters are positioned at the initial-final stages of client requests and responses, allowing pre- and post-processing functions. They can be used for logging, authentication, authorization, validation, common functions, error handling, etc.

Spring Security Framework

  • Provides a security library including authentication and authorization. By applying Lombok (@EnableWebSecurity), you can easily implement login functions using session or token methods, URL request-based authentication and authorization filters, and other security-related functions.

Login Processing Order with Spring Security

  • Submit Username & Password

  • An Authentication object containing user information is created in UsernamePasswordAuthenticationFilter and passed to AuthenticationManager for authentication attempt. User registration status is checked in UserDetailsService.

  • If successful, store the authenticated user information (UserDetails) in SecurityContextHolder and generate a JWT to respond.

    • *During URL requests, verify the JWT and process authentication and authorization in SecurityContextHolder based on the user information included in the token. Apply Lombok (@Secured) to control access permissions for each URL request.
  • If authentication fails, execute failure logic (e.g., respond with a 401 error code).

===

Java Spring 프레임워크로 개발 시, 대부분의 로그인 기능 구현에 사용되는 JWT관련하여 주요 용어를 정리해 보았다.

JWT(Jason Web Token)

  • JSON포맷을 이용하여 사용자 속성을 저장하는 클레임 기반 웹토큰으로, 주로 웹어플리케이션의 인증 및 인가를 위한 쿠키값으로 사용된다. 서버에서 사용자 로그인 시점에 사용자 정보를 기반으로 암호화하여 생성하여 클라이언트 응답에 전달한다. 클라이언트에사 쿠키값으로 보관되며, API요청시 서버에서 해당 JWT값을 검증하여 인증이나 인가를 수행한다.

토큰 vs 세션

  • 토큰: 클라이언트(웹브라우)저에 저장, 상태제어불가, 보안 취약(쿠키정보 노출), 서버 부하가 적고 유연(OAuth2 등)

  • 세션: 서버에 저장, 상태제어 가능(강제로그아웃), 상태적으로 안전, 구현이 용이하지만 서비스(인스턴스)가 늘어나면 부하 높음

Spring.에서 JWT 기반 인증 및 인가 처리 순서

  • 회원가입: ID, Password, 사용자 권한 등 회원정보 등록

  • 로그인: 회원 정보 확인 후, 등록된 사용자인 경우 JWT 생성하여 응답

  • API요청(URL요청): Filter 에서 접근하는 페이지의 인증 이나 인가가 필요한 경우 JWT 검증

    • *필터는 클라이언트 요청과 응답에 대한 최초-최종 단계에 위치하여 사전-사후 기능을 적용할 수 있다. 로깅, 인증, 인가, 유효성검사, 공통기능, 에러처리 등을 적용할 수 있다.

Spring Security 프레임워크

  • 인증 및 인가를 포함한 보안 라이브러리를 제공한다. Lombok(“@EnableWebSecurity”)을 적용하여 세션이나 토큰방식의 로그인기능, URL요청별 인증인가 필터, 그밖에 보안관련 기능을 손쉽게 구현할 수 있다.

Spring Security 적용 시, 로그인 처리 순서

  • Username & Password 제출

  • “UsernamePasswordAuthenticationFilter” 에서 사용자 정보가 담긴 인증객체(“Authentication")을 만들어 “AuthenticationManger”에게 전달하여 인증 시도. “UserDetailService” 에서 사용자 등록 여부 확인

  • 성공할경우, 인증 완료된 사용자 정보(“UserDetails”)를 “SecurityContextHolder”에 저장하고 JWT 생성하여 응답

    • *URL요청 시 JWT 검증 및 해당 토큰에 포함된 사용자 정보를 기반으로 “SecurityContextHolder”에서 인증 및 인가 처리. Lombok(“@Secured”)를 적용하여 URL요청 별 접근 권한을 제어할 수 있다
  • 실패할 경우, 실패로직(예시: 401 에러코드 응답)

Spring(Java)

Leave a Comment: