8차 API Security and JWT

리얼브로·2023년 2월 27일
0
  • 스프링 시큐리티란?

    1. 강력한 인증과 권한 프레임워크
    2. REST API를 인증되고 권한이 있는 요청에만 허락해줌
  • JWT (Json Web Token)

    1. 보안(인증과 권한)에 많이 사용됨
    2. JWT 토큰 형태로 사용됨
      • URL-safe, 웹브라우저 호환, SSO 지원
  • 주요 인증 방식

    1. 로그인 기반 인증(크레덴셜 기반 인증)
      • Credential-based authentication
      • 토큰 기반 인증
    2. 인증정보를 다른 어플리케이션으로 전달
      • 제 3자가 인증을 처리하는 방식
      • OAuth2 방식이라 한다.
      • 페이스북/구글 같은 소셜 계정들을 이용하여 로그인
    3. 2단계 인증
      • Two-factor authentication (ex:휴대폰, e-mail 등..)
    4. 하드웨어 인증
      • Hardware authentication (암복호화???)
  • 서버 기반 인증 시스템 문제점

    1. 세션
      • 유저가 인증할 때 이 기록을 서버에 저장
      • 메모리에 저장 혹은 데이터베이스 시스템에 저장
      • 유저의 수(동시 접속)가 많으면 서버나 DB에 부하
    2. 확장성
      • 클러스터링 구성 시 세션 정보도 같이 공유해야 함
      • 서버 구성이 복잡해짐
    3. CORS(Cross-Origin Resource Sharing)
      • 쿠키를 여러 도메인에서 관리하는 것이 번거로움
  • 토큰 기반 인증 시스템 작동 원리

    • 작동원리
      1. 유저가 아이디와 비밀번호로 로그인 수행
      2. 서버측에서 해당 정보 검증
      3. 계정정보가 정확하다면 서버측에서 유저에게 signed 토큰을 발급
      4. 클라이언트에서는 토큰을 저장해 두고 요청마다 토큰을 서버에 함께 전달
      5. 서버에서 토큰을 검증하고 요청에 응답
  • 토큰 기반 인증 시스템 - 토큰의 장정

    1. 무상태(stateless)이며 확장성(Scalability)이 있음
    2. 보안성
      • 쿠키를 사용하지 않음
      • 토큰환경에서도 취약점은 존재함
    3. Extensibility
      • 서버 확장이 아닌 기능 확장 가능
    4. 여러 플랫폼 및 도메인
      • CORS - 아무 도메인에서나 토큰만 유효하면 요청이 정상적으로 처리됨
    5. 웹 표준 기반
      • JWT - 토큰기반 인증 시스템 구현체(RFC 7519)
  • JSON Web Token

    • JWT 특징

      • 웹표준으로 다양한 프로그래밍 언어에서 지원
      • Self-contained - 필요한 모든 정보를 자체적으로 가지고 있음
      • 웹 서버의 경우 HTTP 헤더에 넣어서 전달 또는 URL 파라미터로 전달 가능
    • JWT 사용되는 상황

      • 회원인증
      • 정보 교환
    • JWT 구조

      • JWT는 .을 구분자로 3가지 문자열로 구성
      • 헤더(Header) - 두 가지 정보를 포함
        • typ : 토큰의 타입을 지정 (JWT)
        • alg : 해싱 알고리즘 지정 (HMAC SHA256, RSA..)
        {
          "typ":"JWT",
          "alg":"HS256"
        }
      • 정보(payload)
        • 토큰에 담을 정보가 포함 (클레임이라고 함, name/value 쌍으로 구성)
        • 클레임(claim)은 다음 세 분류로 나뉨
          • 등록된(registered) 클레임 - iss, sub, aud, exp, nbf, sat, jti
          • 공개(public) 클레임 - 충돌 방지 이름이 필요 (주로 URI 형식으로 네이밍)
          • 비공개(private) 클레임 - 클라이언트와 서버 간의 협의 하에 사용되는 클레임 이름들
            {
              "iss":"example.com",
              "exp":"1485270000000",
              "https://example.com/jwt_claims/is_admin":true,
              "userId":"11028373727102",
              "username" : "kim"
            }
      • 서명(signature)
        • 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬하여 생성
    • JWT 토큰 만들기

      • 디펜던시 설정
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
          <groupId>io.jsonwebtoken</groupId>
          <artifactId>jjwt</artifactId>
          <version>0.9.1</version>
        </dependency>
      • JWT 토큰 만들기 동영상 부터 다시....

0개의 댓글