프로그래밍 일기 — Java의 봄(Spring)의 마지막

배우는 자(Learner Of Life)
5 min readSep 17, 2023

--

이제 첫 번째 봄은 끝났다.

Java Spring을 처음 만난 첫 번째 봄이 지나가고있다(1).

지난 목요일을 끝으로 주특기 과정이 끝났다. 이제는 배운 것을 바탕으로 본격적인 프로젝트를 시작하는 주차다. 나와 나의 팀원들은 이제 10일 동안 프로젝트를 선정해 매진해야한다. 풀스택 프로젝트를 하나 만들고, 거기서 백엔드 과제(시간 개념을 이용한 알림 개념 혹은 데이터 처리 효율성 개선 등)에 도전해야한다. 그 이후에는 본격적인 포트폴리오를 만들기 위한 메인 프로젝트를 6주간 진행한다. 그래서 이번 주차가 매우 중요하다. 내가 이제까지 배운 개념들을 적용해 보고, 실용적인 능력을 발달시킨다는 측면에서 말이다.

내가 지난 3주간 압축적으로 Spring을 배우면서 가장 힘들었던 것 중 하나는 Spring Security의 기술을 이해하는 것이다. 이 것 자체를 이해하는 것은 그리 중요한 것이 아닐 수도 있다. 회사에 따라 Security를 적용하는 필터(Filter)의 수준이 다를 수 있고, 아예 다른 보안 기술을 적용하기도 하기 때문이다. 그러나 Spring Security를 배워놓으면 회사에서 어플리케이션 상의 보안을 적용할 때 그 틀이 크게 변하지 않으므로 특별한 보안 솔루션을 고안하는 곳이 아니라면 그 지식은 유용할 수 밖에 없다. 결론적으로 Spring Security는 알면 도움이 된다는 것이다.

따라서 오늘은 Spring Security에 대한 개념을 정리하고자한다. 사실 2주차에서 이 개념을 배웠는데, 이 부분을 내가 그 주차 프로젝트에서 제대로 구현하지 못했다. 이 주제에 대해서 내가 확실하게 이해하지 못하고 넘어갔다는 마음에, 오늘은 이 개념에 대해 다시한번 짚어보려한다.

Spring Security

  • JWT는 RFC라는 기준을 사용한다(2).
  • Refesh토큰에 많은 정보를 담는 것은 서버에 가해지는 부가가 증가할 수 있으므로 좋지 않을 수 있다.
  • JWT는 꼭 어떻게 써야한다는 규정은 없다.
  • 어떤 프레임워크나 기술을 사용할지는 회사마다 다르지만, Spring Security에 익숙해지면 어디를 가건 비슷하게나마 보안 장치를 구현할 수 있다.
  • Security자체를 아는 것 보다는 Security를 어떻게 다루고 구현하는지가 중요하다.

Refresh Token

  • 장점: Refresh Token은 만료기한을 조금 더 유연하게 가져갈 수 있다.
  • 단점: http요청을 계속해서 보내기 때문에 리소스 낭비 커짐

관리 방법

  • 서버에서 관리
  • 클라이언트에서 헤더(쿠키)에 담기
  • Refresh Token자체를 일회용으로 만들어 요청이 만들어 질 때마다 재발급(remote refresh token)

Access Token 발급요청 방식

  • Access Token 만료기한을 직접 판단하여 토큰 재발급 요청
  • 서버에 토큰 만료기간의 판단을 위임하여 401에러, 유효하지 않은 토큰 메시지 반환시 재발급 요청

만료 판단 단계

  1. 프론트가 만료 기한 판단
  2. 만료되었을 때 재발급 API를 통해 요청하여 토큰 재발급
  3. 적절한 API 요청
  4. 클라이언트가 모든 API 요청시 토큰을 확인하여 만료기한을 확인

재요청 단계

  1. 클라이언트에서 API 요청
  2. 서버는 만료기한 확인해 401 반환
  3. 서버에서 토큰 반환
  4. 적합한 API 재요청

CSRF(Cross Site Request Forgery)

  • 링크를 누르면 비밀번호를 바꾸거나 송금을 하게하는 피싱(phishing)형태의 공격
  • Http요청은 쿠키가 있으면 계속해서 자동으로 넣는다.
  • Header를 세팅할때의 단점은 매순간 요청시 일일히 설정을 해 줘야한다는 것이다.
  • Spring Security는 이러한 형태의 공격에 비교적 안전하다.
  • 쿠키에 httponly 설정을 해 주면, JS API가 접근할 수 없다(서버에만 전달할 수 있다.). 이렇게하면 의도하지 않은 그룹이나 스크립트에 의해 쿠키가 접근되는 것을 차단할 수 있다(3).
  • 서버에서 세션 대신 토큰을 활용해 CSRF를 방어하면 보안성이 높아지지만 서버에 부담이 커진다.

필터 과정

  1. 테이블 생성
  2. HTTP 요청(POSTMAN 요청과 같은 방식)으로 회원가입 및 로그인
  3. Spring Security 필터 동작(모든 활성화 필터 동작 됨)

많이 쓰이는 인증 및 인가 필터/클래스 예제

  • JwtAuthorizationFilter : 토큰 검증하여 인가 처리
  • JwtAuthenticationFilter : 토큰 검증하여 인증 처리
  • AuthFilter(AuthorizationFilter) 토큰과 무관한 인가
  • doFilterInternal : 토큰이 없을 대에 대한 처리
  • SuccessfulAuthentication : 인증 성공시 처리 클래스
  • UnsuccessfulAuthentication : 인증 실패시 처리 클래스

Security 학습 방법/태도

  • Spring Security Doc을 보는 것 밖에 없다.
  • Spring Security에 집중하기 보다는 이 것이 내가 보안 문제를 해결하는데 적합한지를 고민하는 것이 중요하다(Security가 필요없으면 다른 방법을 찾을 수 있으므로, 기술이 아닌 문제에 집중할 것).

참조:

(1) https://pixabay.com/photos/landscape-nature-oilseed-rape-field-3369304/

(2) https://datatracker.ietf.org/doc/html/rfc7519

(3) https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

--

--

배우는 자(Learner Of Life)
배우는 자(Learner Of Life)

Written by 배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.

No responses yet