Spring boot의 인증 방식

2023. 11. 10. 20:52Springboot

0. 인증과 인가란? 

    인증과 인가

          인증 : 식별자의 식별 가능한 정보(이름, 이메일)를 통해 유저의 신원을 확인하는 것
                  로그인을 통해 해당 사용자가 db에 저장되어 있는지 확인
          인가 : 사용자의 권한에 따른 리소스 전달을 허가 확인하는 것

                  우리는 이를 통해 다른 사람의 todo글을 수정, 삭제를 불가능하게 만들 것
                  로그인을 할때(인증) 로그인을 한 후, 비회원과 회원 여부에 따라 권한을 다르게 부여

         

         인증 방식 :
             1. 세션 저장소 // springboot 회원가입 
                 해당 방법은 spring boot의 default로 사용하는 spring security방법
                 시큐리티는 spring boot의 dispatcherServlet보다 앞단에 있는 filter로 해당 로그인이 이루어지면

                 dispatcherServlet보다 빠르게 가로채서 spring security에서 인증방식을 실행해야 한다.
                 [출처] : https://k3068.tistory.com/88

              2. jwt // 이번에 만들어볼 회원가입

                      [출처]: https://mangkyu.tistory.com/56 

                 JWT란?

                   JWT(Json Web Token)란 Json 포맷을 이용하여

                   사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.                                         

                   JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다.

                   주로 회원 인증이나 정보 전달에 사용되는 JWT는 아래의 로직을 따라서 처리된다.

 

                 JWT의 구성요소
                    JWT는 헤더(header), 페이로드(payload), 서명(signature) 세 파트로 나눠져 있으며,

                    아래와 같은 형태로 구성되어 있다.



                 jwt 구조

jwt 구조


                  [출처] : https://velopert.com/2389
                 Header / Payload / Signature
                        Header : 토큰의 헤더는 토큰의 유형(typ), Signature를 해싱하기 위한

                                    알고리즘(alg)을 지정하는 두 가지 정보로 구성되어 있다. 
                          typ: 토큰의 타입을 지정 ex) JWT
                          alg: 알고리즘 방식을 지정하며, 서명(Signature) 및 토큰 검증에 사용

                                ex) HS256(SHA256) 또는 RSA
                                     {
                                        "alg": "HS256",
                                         "typ": "JWT"
                                     }
                        Payload : 토큰의 페이로드에는 토큰에서 사용할 정보의 조각들인 클레임이 담겨 있다.   
                            비공개 클레임 : 토큰 발급자와 수신자 간의 비공개 정보(username, role)

                            공개 클레임 : 공개용 정보를 나타내는 클레임
                            등록된 클레임 : 토큰에 대한 정보(만료일, 발급일)

                             iss: 토큰 발급자(issuer)
                             sub: 토큰 제목(subject)
                             aud: 토큰 대상자(audience)
                             exp: 토큰 만료 시간(expiration),

                                   NumericDate 형식으로 되어 있어야 함  ex) 1480849147370
                             nbf: 토큰 활성 날짜(not before), 이 날이 지나기 전의 토큰은 활성화되지 않음
                             iat: 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간을 알 수 있음
                             jti: JWT 토큰 식별자(JWT ID), 중복 방지를 위해 사용하며,

                                 일회용 토큰(Access Token) 등에 사용
                         Signature : 
                           해당 토큰이 조작, 변경되지 않았음을 검증할 때 사용하는 고유한 암호 코드입니다.

                           서명은 header와 payload를 인코딩하고 인코딩한 비밀 키를 이용해 header에서

                           정의한 알고리즘으로 해싱하여 이 값을 다시 base64Url로 인코딩하여 생성합니다.
                                 HMACSHA256(
                                      base64UrlEncode(header) + "." +
                                      base64UrlEncode(payload),
                                      your-256-bit-secret
                                  ) 

JWT Header, Payload, Signature

'Springboot' 카테고리의 다른 글

Spring boot 중복된 Bean 에러  (0) 2023.11.30
Spring HTTP 요청과 응답  (0) 2023.11.13
스프링 유저 프로필 사진  (5) 2023.11.09
스프링 이미지 업로드(2)  (0) 2023.11.07
스프링 메모장  (1) 2023.11.01