Spring Security

인증 / 인가 / JWT

운동하는 주니어개발자 2023. 6. 28. 20:31

📌 인증 / 인가 

📖 인증이란 ?

인증이란 사용자의 신원을 검증하는 행위로 보안 프로세스에서의 첫 번째 단계이다. 가장 흔한 예시로는 로그인을 설명할 수 있다.

회원가입을 하고 로그인을 진행할 때 사용자 이름과 비밀번호는 가장 많이 사용되는 인증 요소이다.

사용자가 데이터를 올바르게 입력하면 시스템은 올바르다고 판단하고 로그인을 허용하고 올바르게 입력하지 않으면 허용해주지 않는다.

이 외에도 외부 기관을 통해 보안 코드를 생성하여 인증하는 인증 앱, 지문이나 망막 스캔을 제출하는 생체인식 등이 인증에 포함된다.

📖 인가란 ?

인가란 사용자에게 특정 리소스나 기능에 액세스할 수 있는 권한을 부여하는 프로세스를 만한다.

대표적으로 서버에서 특정 파일을 다운로드할 수 있는 권한을 부여하거나 개별 사용자에게 관리자 권한을 부여하는 경우가 해당된다.

사용자가 먼저 자신의 자격을 입증하면 관리자가 해당 사용자에게 권한을 부여하는 것을 인가라고 설명할 수 있다.

 

즉 인증이란 사용자가 올바른 사용자인지 확인하는 방법이고 인가는 인증이 완료된 사용자에게 어떠한 권한을 부여하는 것이라고 보면 된다.

📖 JWT(Json Web Token) 란?

Json을 이용하여 사용자에 대한 속성을 저장하는 Web Token이다. 일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용한다.

웹 상에서 정보를 Json형태로 주고 받기 위해 표준규약에 따라 생성한 암호화된 토큰으로 주로 회원 인증이나 정보 전달에 사용된다.

예시로는 다들 평상시에 사용하는 사이트 및 게임 사이트 등에서 자기 자신만의 ID와 Password를 회원가입 후에 소지하고 있을것이다.

그렇다면 그 사이트를 운영하는 회사에서는 나의 ID와 Password를 소지하고 있으며 나의 정보를 확인할 수 있을것이다 라는 생각을 해봤을 것이다.

이러한 문제를 해결하기 위해 사용자가 회원가입할 때 작성했던 비밀번호를 사람이 알아볼 수 없게 암호화를 걸어 내 정보를 확인할 수 없게 JWT를 사용해 암호화 할 때 자주 사용한다.

JWT외에도 session방식 등이 있다.

📖 Session이란 ?

세션은 브라우저와 웹 서버가 연결되어 브라우저가 종료될 때 까지의 시점을 기록하는 것이다. 브라우저를 통해 서버에 접속할 때

서버에서 세션 id를 쿠키에 담아 돌려주고 사용자는 그 세션id를 통해 서버에 요청함으로 써 서버가 클라이언트를 식별할 수 있게 인증하는 방식이다.

📖 JWT(Json Web Token) 장점

✔️ 서버에 사용자들이 매우 많이 접속하더라도 서버에 대한 부담이 덜하다.

이유는 세션방식 같은 경우에는 해당 사용자의 id만 전달받음으로 해당 사용자가 올바른 사용자인지 id를 통해 확인을 해야하고

확인을 하기 위해서는 사용자의 정보들이 따로 저장되어있는 파일을 유지하고 조회해야 하는데 사용자가 1억명이라고 가정한다고 하면

1억명의 정보가 저장되어 있는 파일에서 조회하고 유지해야 하므로 서버에 부담이 많이되는 반면에 JWT는 토큰 발급일 유효기간 등

다양한 정보가 담아져 있기 때문에 따로 조회하지 않고 해당 토큰만 확인하면 되므로 서버의 부담을 줄여주고 처리가 빠르다.

📖 JWT(Json Web Token) 단점? 문제점?

✔️ alg : none 공격

JWT를 사용할 때 알고리즘을 HS256이 아닌 none를 사용하게 되면 문제가 발생할 수있다. 

none으로 채워서 직접 만든 토큰들을 서버로 보내보는 악성 유저들이 존재한다. 가끔 서버들은 HS256이 아닌 none으로 토큰을 만들곤 하는데

그렇게 되면 악성 유저들이 서버에 들어올 수 있게 된다.

✔️ JWT는 변환이 쉽다. (DECODE)

JWT는 변환이 쉽기 때문에 민감한 유저 정보를 넣으면 안되고 최소한의 정보만 넣을 수 있도록 하자.

✔️ 시크릿키 문제

개발자들은 JWT를 구현을 할 때 시크릿 키를 개발자 마음대로 결정할 수 있는데 시크릿키를 대충적으면 안된다.

대충 작성하거나 강의를 따라서 작성하거나 예제로 사용하는 시크릿 키를 작성하게 되면 때려맞추기가 쉽다.

좋은 시크릿 키의 예시로는 키를 매우 길게 성정하거나 시크릿 키를 남들과 공유하지 않아야 한다. 또는 생성용키 / 검증용키 2개를 사용한다.

✔️ JWT 탈취

어떠한 사용자가 카드를 도난 당했다고 예를 들어보자. 사용자가 카드를 잃어버렸을 때 카드사에 전화해 카드 사용을 정지시켜 달라고 요구를 하면

도난을 당하더라도 걱정이 없지만

JWT토큰을 도난 및 잃어버리게 됬을 경우 토큰을 회수하거나 사용 정지를 시키는 것은 불가능하기 때문에 유효기간이 만료될 때 까지 계속 사용 가능하다.

JTW 탈취의 예방법은

1. 훔치기 어렵게 저장소를 따로 만들어 저장한다.

2. JWT의 유효기간을 짧게 유지한다. 이러한 방법을 사용한다면 재발급이 가능하게 한다.

📖 오늘의 결론!!

대부분의 서비스들은 세션방식으로 회원 인증방식을 구현한다. 하지만 회원 및 사용자가 많다면 JWT를 사용하는 것이 좋을 수 있다.

JWT를 사용하여 인증기능을 실습하면서 모르고 넘어갔던 개념들을 공부하면서 많은것을 알았던거 같다.

해당 내용은 여러 블로그를 읽어보고 정리한 내용이고 무엇 보다도 유튜브 코딩애플님의 영상에서 많은 내용을 정리했던거 같다.

유튜브 코딩애플님의 영상을 여러가지 시청하면서 필요한 내용을 짧고 간결하게 설명해주는 점이 굉장히 좋았고 자주 시청할 생각이다.

개발자에 대해 궁금한 내용이 있다면 코딩애플님 채널에 가서 시청하는 것도 많은 도움이 될거같다고 생각하면서 마무리하겠다.