스프링 인증과 인가

심규원·2024년 8월 19일

인증(Authentication)
인증은 해당 유저가 실제 유저인지 인증하는 개념

인가(Authorization)
인가는 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념

일반적으로 서버-클라이언트 구조로 되어있다.

Http 프로토콜을 이용하여 통신하는데 그 통신은 비연결성(Connectionless) 무상태(Stateless) 로 이루어짐

비연결성은 서버와 클라이언트가 연결되어 있지 않다는 것.
리소스를 절약하기 위해 요청때만 서버가 응답한다.

무상태는 서버가 클라이언트의 상태를 저장하지 않는다는 것.
기존의 상태를 저장하는것도 서버의 비용과 부담을 증가시키는 것이기때문에 기존의 상태가 없다고 가정하는 프로토콜을 이용해 구현
실제로 서버는 클라이언트가 직전에 또는 그 전에 어떠한 요청을 보냈는지 관심도 없고 전혀 알지 못함

일반적으로 웹 애플리케이션은 두가지 방법을 통해서 인증을 처리한다.

쿠키 - 세션 방식의 인증

서버가 특정 유저가 로그인 되었다 라는 상태를 저장하는 방식
인증과 관련된 아주 약간의 정보만 서버가 가지고 있게 되고 유저의 이전 상태의 전부는 아니더라도 인증과 관련된 최소한의 정보는 저장해서 로그인을 유지시킨다는 개념

JWT 기반 인증

JWT(JSON Web Token) 란 인증에 필요한 정보들을 암호화시킨 토큰을 의미. JWT 기반 인증은 쿠키/세션 방식과 유사하게 JWT 토근(Access Token) 을 HTTP 헤더에 실어 서버가 클라이언트를 식별한다.

쿠키와 세션이란 무엇인가?

쿠키와 세션 모두 HTTP 에 상태 정보를 유지(Stateful) 하기 위해 사용됨
즉, 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 된다.

  1. 쿠키
    클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일
    F12 개발타도구를 통해서도 확인 가능하다.
  • 구성요소
    • Name (이름): 쿠키를 구별하는 데 사용되는 키 (중복될 수 없음)
    • Value (값): 쿠키의 값
    • Domain (도메인): 쿠키가 저장된 도메인
    • Path (경로): 쿠키가 사용되는 경로
    • Expires (만료기한): 쿠키의 만료기한 (만료기한 지나면 삭제)
  1. 세션
    서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
    서버에서 클라이언트 별로 유일무이한 '세션ID' 를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
    서버에서 생성한 '세션ID' 는 클라이언트의 쿠키값('세션 쿠키' 라고 부름)으로 저장되어 클라이언트 식별에 사용

쿠키 생성.

HttpServletResponse 객체에서 생성한 Cookie 객체를 추가하여 브라우저로 반환
이렇게 반환된 쿠키는 브라우저의 쿠키 저장소에 저장됨

쿠키 읽기.
쿠키의 Name 정보를 전달해주면 해당 정보를 토대로 Cookie 의 Value 를 가져옴

HttpSession 생성.
HttpServleRequest 를 사용하여 세션을 생성 및 반환.
세션에 저장할 정보를 Name-Value 형식으로 추가.
반환된 세션은 브라우저 쿠키 저장소에 JSESSIONID 라는 Name 으로 Value 에 저장됨

HttpSession 읽기.
Name 을 사용하여 세션에 저장된 Value 를 가져온다.




JWT 란 무엇인가

JWT(Json Web Token) 란 JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token.
토큰의 한 종류 이다.

로그인 정보를 Server 에 저장하지 않고 Client 에 로그인 정보를 JWT 로 암호화하여 저장 -> JWT 를 통해 인증/인가.
모든 서버에서 동일한 Secret Key 소유.
Secret Key 를 통한 암호화 / 위조 검증(복호화 시)

  • JWT 장/단점
    1. 장점

      • 동시 접속자가 많을 때 서버 측 부하 낮춤
      • Client, Sever 가 다른 도메인을 사용할 때
        • 예) 카카오 OAuth2 로그인 시 JWT Token 사용
    2. 단점
      - 구현의 복잡도 증가
      - JWT 에 담는 내용이 커질 수록 네트워크 비용 증가 (클라이언트 → 서버)
      - 기 생성된 JWT 를 일부만 만료시킬 방법이 없음
      - Secret key 유출 시 JWT 조작 가능

쿠키 찾기 코드.
쿠키에 담긴 정보가 여러 개일 수 있기 때문에 그 중 이름이 JWT 가 담긴 쿠키의 이름과 동일한지 확인하여 JWT 가져옴

서버 에서는 ..
1. Client 가 전달한 JWT 위조 여부 검증 (Secret Key 사용)
2. JWT 유효기간이 지나지 않았는지 검증
3. 검증 성공시,
1. JWT → 에서 사용자 정보를 가져와 확인

        ex) **GET /api/products** : JWT 보낸 사용자의 관심상품 목록 조회
        
        

JWT 는 누구나 평문으로 복호화 가능
하지만 Secret Key 가 없으면 JWT 수정 불가.
그러니까 JWT 는 Read Only 데이터.

토큰 생성

토큰 저장

토큰 substr

토큰 검증

토큰에서 사용자 정보 가져오기

0개의 댓글