💡 인증(Authentication)과 인가(Authorization)
인증(Authentication)
- 사용자의 신원을 확인하는 과정
- ex) 로그인
인가(Authorization)
- 인증된 사용자에 대하여 자원의 접근권한을 확인하는 것
- ex) 일반 계정과 관리자 계정의 차이, 일반 계정으로 관리자 기능을 사용할 수 없다.
💡 JWT란 무엇인가?
- Json 포맷을 통해 사용자에 대한 속성을 저장하는 Web Token이다.
- JWT 구조는 Header, Payload, Signatre로 이루어진다.
Header | 토큰의 타입과 암호화 알고리즘 정보를 포함한다. |
Payload | json key-value의 형태로 데이터를 담는다. 각 정보들을 claim이라고 부른다. |
Signature | 헤더와 페이로드를 인코딩하고, 시크릿 키를 사용하여 서명된 값이다. 토큰의 유효성을 검증할 때 사용된다. |
💡 JWT를 이용한 인증 과정
1. 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.
2. 사용자가 성공적으로 인증되면, 서버는 Access Token을 발급한다.
3. Access Token을 클라이언트의 로컬 스토리지에 저장하거나 쿠키 등에 저장한다.
4. 클라이언트는 인증이 필요한 요청을 보낼 때마다 해당 토큰을 서버에 제공한다.
5. 서버는 토큰의 서명을 검증하여 변조 여부를 확인하고, 만료 시간을 확인하여 토큰이 유효한지 판단한다.
6. 토큰이 유효하고 검증이 완료되면, 권한 확인 후 요청된 데이터를 응답해 준다.
💡 토큰의 서명으로 어떻게 검증하는 걸까?
헤더와 페이로드를 이용하여 서명을 검증한다.
- JWT 헤더를 디코딩하여 사용된 서명 알고리즘을 확인한다.
- 서버에 저장된 secret key를 시용하여 토큰의 서명을 생성한다.
- 생성한 서명과 토큰에 포함된 서명을 비교하여 일치하는지 확인한다,
인코딩(Encoding): 원본 데이터를 다른 형식으로 변환하는 과정
디코딩(Decoding): 인코딩 된 데이터를 원래의 형식으로 변환하는 과정
💡 Access Token & Refresh Token
Access Token
- 보호된 리소스에 접근할 때 사용되는 토큰
- 로그인 후 서버는 Access Token을 발급한다.
- 토큰 탈취를 방지하기 위해 보통 짧은 유효기간을 가지고 있는다.
Refresh Token
- Access Token의 갱신을 위한 토큰
- Access Token의 유효 기간 만료 시, Refresh Token을 사용하여 새로운 Access Token을 발급받는다.
💡 그럼 토큰은 어떻게 탈취를 당하는가?
탈취 예방을 위해 refresh token을 사용한 프로젝트 경험이 있었지만
면접에서 이에 대한 질문에 스크립트 공격만 생각나고, 제대로 설명을 하지 못해서 정리해보려 한다.
XSS(Cross-Site Scripting), CSRF(Cross-Site request forgery) 등 공격 방법으로 탈취를 당할 수 있다.
XSS(Cross-Site Scripting)
- XSS는 악의적인 스크립트(소스 코드)를 삽입하여 사용자의 브라우저에서 실행되게 한다.
- 이로 인해 사용자의 세션 정보, 쿠키, 비밀번호 등 개인 정보를 탈취할 수 있다.
CSRF(Cross-Site request forgery)
- CSRF는 인증된 사용자의 권한을 이용하여 특정 웹사이트에 악의적인 요청을 보내는 공격이다.
💡 그럼 Refresh Token도 탈취되면 소용이 없는 게 아닌가?
대부분 Refresh Token을 서버 쪽 데이터베이스에 저장하고, 로그인이나 토큰 갱신 시 쿠키를 사용하여 전송한다.
그리고 Http Only Cookie를 설정하여 브라우저에서 쿠키에 접근할 수 없도록 제한하여 보안을 강화한다.
하지만 그럼에도 불구하고 탈취 가능성이 있다.
대표적인 방법으로 네트워크 패킷을 조작 및 탈취하는 방법인 중간자 공격(MITM: Man In The Middle) 등이 있다.
중간자 공격(MITM: Man In The Middle)
- 통신 중간에 정보를 도청/위조하는 공격
패킷(paket)이란?
네트워크를 통해 전송하기 쉽도록 자른 데이터의 전송 단위이다.
데이터는 패킷으로 분할되어 전송되고, 수신 측에서는 이러한 패킷을 다시 조립하여 원래의 데이터로 복구한다.
Refresh Token 탈취 시 Access Token을 발급받을 수 있다. 하지만 Refresh Token은 '무효화'를 할 수 있다.
서버에서도 Refresh 토큰을 저장하기 때문에, 토큰을 삭제하여 무효화를 시켜버리면 Access Token을 발급받을 수 없다.
'보안 및 인증' 카테고리의 다른 글
OAuth 2.0 개념과 동작 흐름 (0) | 2023.06.30 |
---|