Search
🔐

Spring Security 도입기

글감
BE
Spring
Java
작성자
작성 일자
2025/03/25 09:12
상태
작성 중
공개여부
비공개
Date
생성자
작업자

문제상황

42 측의 휴학 유저(AGU) 추가 와 Cabi 내에서 수요지식회 업데이트 가 진행되면서 기존 인증, 인가 방식에 대해 부족함을 느끼게 되었다.
휴학 유저는 42 oauth 로그인 불가능 → cabi 서비스를 이용할 수 없음 사물함 반납을 못하게되니 채널에 대리반납을 요청하거나 문의를 넣는 유저들이 꽤 발생했다. 42 oauth 서버 다운 시 대체 로그인 방식을 도입할 겸, 소셜 로그인 연동기능을 추가해 휴학 유저도 서비스 이용 가능케하자.
수요 지식회가 리뉴얼되며 발표에 대한 사진 및 영상을 발표자가 포트폴리오로 활용할 수 있도록 기록하는 것이 큰 목표가 되었고, 이로 인해 외부 이용자도 자유롭게 발표 내용 및 일정을 볼 수 있어야한다. 기존 서비스에서는 accessToken이 없으면 무조건 서비스 이용이 불가능했으니, 인가 방식을 변경해보자

기존 방식

OAuth2 로그인 ScribeJava 라이브러리를 사용, yml 파일을 주입받은 url 관련 Property 객체 생성, 지정된 url로 요청을 보내 정보를 내려받음
새로운 소셜 로그인을 추가할 때마다 객체를 새로 만들고, 컨트롤러도 새로 만들어야해서 내가 언해피함
모든 요청에 대한 Interceptor + 커스텀 어노테이션 AuthGuard, AOP 방식 요청 시 access_token 검증, 토큰 파싱 후 내부의 email을 쿼리로 돌아 실제 유저인지 검증 및 인가
public한 페이지에 대해서는 어떻게..? 모든 요청에 대해서 불필요하더라도 유저인지 검증하기 위해 쿼리가 1회씩 꼭 돌아서 인증 / 인가의 경계가 모호함

목표

1.
ServletFilter에서 url별 인가 검증하기
2.
여러 개의 소셜 로그인 연동 추가 방식 간소화하기
3.
access, refresh token 도입하기 및 정보 덜어내기
쉽게, SNS로그인 + JWT 인가 구현할건데, 이걸 Spring Security와 함께할겁니다 ㄱㄱ!!

Spring Security?

인증(Authentication, 로그인), 인가(Authorization, 권한 부여)와 관련해 편리한 기능들을 제공해주는 라이브러리이다. 이 글을 읽는 Security에 대해 궁금한 누군가도 함께 어떻게 구현했는지 구경하며 Security를 느껴보자.
Q. 그럼 Security를 이해하기 위해서는 뭐부터 알아야해요?
A.
도망가지 말아다오.. 생긴거만 험악하지 읽어보면 다들 따스한 필터들이다.. 하지만 아~ 대충 rgrg, 일단 박죠? 했을 경우 남는건 수많은 Servlet 및 FilterChain Exception 관련 로그와 어디에서 발생한지도 모른 채 돌아온 401, 403 에러들 뿐ㅠㅠ 저런 수많은 필터를 쓰는 근본적인 이유는 아래의 두 개념을 세분화하여 관리하기 위함이다!

인증(Authentication)

인증은 쉽게 말하면 로그인 이라고 생각하면 된다. 웹앱이 너 누구야? 했을 때 아이디 비밀번호를 입력 → 자격 증명 → 저 유저 맞는데요 로그인 실패 시 security는 AuthenticationException을 반환하고, Unauthorized 401으로 처리된다
에러 이름은 authorized(인가)인데 왜 authentication(인증)이랑 관련?
저도 궁금했는데요.. Unauthorized 용어 자체가 사용자가 인증되지 않았거나, 인증 정보가 유효하지 않다는 뜻까지 확장됐기 때문이라고합니다. 오래된 애라 그렇다함..

인가(Authorization)

권한, 즉 어디까지 접근 가능하세요?를 물어본다. 서버의 cabinet 관련 리소스는 ‘USER’ 롤 이상부터 접근 가능하다고 판별을 한다던지 머.. security에서는 AccessDeniedException을 반환하고, 403 Forbidden으로 처리된다.
캬~ 인증 인가에 대해 깨달았다? 일단 나보다 Security 잘한다고 자부한다.
이제 코드와 함께 필터가 어떻게 작동하는지 알아보자!