[백엔드] Auth란 무엇인가, 세션(Session)과 토큰(Token)의 차이점

728x90

오늘은 Auth에 대해 알아보려고 합니다. 

프로젝트를 혼자하다 보니 조금씩 지체되고 있는데 하루 빨리 진행해보고 싶네요. 지금은 프론트엔드 기본 컴포넌트들을 정리하고 있고 스토리보드까지 완료한 상태입니다.

처음 진행할 내용으로 회원가입과 로그인이라 간단하게 Auth에 대해 알아보려고 합니다. 로그인과 회원가입은 '입력값이 동일하면 완료', '필요한 정보들을 입력하고 회원가입 클릭'하면 완료라고 생각했습니다. 그래서 '그냥 디비 접속해서 true, false, 값 저장만 하면 되지 않나?'라고 생각했습니다. 하지만 대학시절 어깨 너머 들었었던 auth와 firebase로 auth를 진행한 경험이 있는데 잘 알지 못하면서 사용했었고 면접에서도 해당 내용이 있었지만 잘 대답하지 못했던 경험이 있었습니다. 그래서 오늘은 auth에 대해 알아보고 Auth의 종류도 알아보겠습니다.


Auth를 알아가기 전 Auth의 의미

Auth는 Authentication(인증)과 Authorization(권한 부여)의 약자로, 사용자나 시스템의 신원을 확인하고, 특정 자원에 대한 접근 권한을 부여하는 과정을 말합니다.

Authentication : 사용자가 누구인지 확인하는 과정

Authorization : 인증된 사용자가 어떤 권한을 가지고 있는 지 확인하는 과정

Authentication은 로그인이 될 수 있을 것입니다. 아이디와 비밀번호를 입력하여 로그인하거나 소셜 로그인하거나 휴대폰 인증, 생체 인증이 있습니다. Authorization은 로그인한 사용자의 정보를 확인하는 과정인데 사용자가 다른 사람의 정보를 확인할 수 있다면 다른 사람의 권한이 타인에게 있다고 하면 말도 안되는 이야기겠죠. 또한 관리자의 권한이 모든 게시물을 삭제할 수 있습니다. 하지만 다른 사용자가 맘에들지 않는 게시물이 있다고 해서 다른 사람의 게시물을 삭제할 수 있다는 것도 말도 안되죠. 이런 방식으로 우리가 알고있는 로그인 방식입니다.

내가 아이디와 비밀번호를 입력하여 접속(Authentication)하면 내가 가지고 있는 권한, 내가 올린 글이나 구독 정보, 개인정보만 확인(Authorization)할 수 있다는 것입니다.

 

단순 로그인의 고충

일반적으로 로그인 정보, 아이디와 비밀번호를 입력하면 로그인 성공이다. 하지만 이 정보를 만약 누군가 알고 있다면? 내 정보들은 모두 털리게 되는 것입니다. 다른 PC에서 로그인했다가 로그아웃을 깜박하고 못했을 때 다른 사람이 해당 사이트에 들어가보면 로그인 정보가 다 남아 있어 비밀번호를 악의적으로 바꾸면 로그인도 못하게될 것입니다. 이런 오류를 해결하는 것도 Auth의 역할이라고 생각합니다.

  1. 제 3자의 데이터 악용
  2. 중간자 공격(Man-in-the-Middle Attack) : 로그인 과정에서 데이터가 암호화되지 않으면, 네트워크에서 통신 내용을 가로채 비밀번호나 민감한 정보를 탈취
  3. 인증된 사용자 확인 불가능 : 실제 사용자로부터 온 것인지 확인할 수 없음
  4. 권한 관리 문제 : 인증 없이 로그인만 있을 경우 사용자가 접근해서는 안 되는 데이터나 기능에 접근 가능
  5. 강제 브루트포스 공격(Brute Force Attack) : 비밀번호 입력을 무제한으로 허용하면 공격자가 무작위로 비밀번호를 시도하여 계정을 탈취
  6. 세션 하이재킹(Session Hijacking) : 로그인 후 인증 절차 없이 세션이 노출되면, 공격자가 세션 토큰을 가로채 동일한 세션으로 접근 가능
  7. 로그아웃 기능 미비로 인한 문제 : 인증 없이 로그인만 있다면, 사용자가 로그아웃하지 않고 자리를 떠났을 때 다른 사람이 그 세션을 사용 가능
  8. 다단계 인증 미비로 인한 추가 위협 : 공격자가 비밀번호를 유출하거나 피싱을 통해 사용자의 정보를 얻으면 쉽게 계정을 탈취
  9. 데이터 위변조 : 인증이 없으면 데이터를 수정한 사람이 누구인지 추적할 수 없으며, 악의적인 사용자가 데이터를 조작 가능
  10. 사용자 신뢰 상실 : 보안이 취약하면 사용자들은 해당 서비스를 신뢰하지 않게 됨

굵게 표시한게 auth를 하지 않으면 발생 가능한 에러사항으로 개인적인 생각입니다. 

 

Auth의 주요 요소

주요 요소는 사용자의 신원을 확인하고, 해당 사용자가 어떤 리소스에 접근할 수 있는지 결정하는 데 중요한 역할을 합니다. 

1. 사용자 인증과 권한 : 사용자가 누구인지 인증하고 인증이 완료된 후 사용자가 어떤 리소스에 접근할 수 있는지 결정합니다

2. 세션 관리 : 인증 후 사용자가 로그인 상태를 유지하게 하는 방법

3. 토큰 기반 인증 : 사용자 인증 정보를 저장

4. 다단계 인증 과정 : 사용자가 로그인할 때 두 가지 이상의 인증 방법을 요구하는 보안 기능

5. 비밀번호 관리 : 사용자의 비밀번호를 안전하게 저장하고 관리하는 방법

6. 로그인 세션 로그 : 사용자가 시스템에 로그인하고 수행한 작업을 기록하는 기능

이 외에도 세션 타임아웃, 역할 기반 접근 제어, IP 및 기기 인증이 있습니다. 여기에서 세션과토큰을 제외하고는 어떤 과정을 통해 지원되는지 이해할 수 있을 것입니다. 세션과 토큰에 대해 알아보겠습니다(쿠키도 함께 간단하게 작성하겠습니다) 또한 다른 auth 기술이 있다면 함께 알아보면 좋겠습니다. 

 

 

Auth 구현에 사용되는 기술

세션(Session)

세션은 사용자가 인증된 상태를 유지하기 위해 서버가 관리하는 일시적인 데이터입니다. 세션은 보통 서버에 저장되며, 사용자의 인증 정보를 서버에서 직접 관리합니다.

  • 사용자가 로그인하면, 서버는 세션을 생성하고 세션 ID를 클라이언트(사용자)에게 전달합니다. 이 세션 ID는 쿠키나 URL 매개변수로 클라이언트에 저장됩니다.
  • 클라이언트는 요청을 보낼 때마다 이 세션 ID를 포함시키고, 서버는 세션 ID를 통해 사용자의 인증 상태를 확인합니다.
  • 서버는 세션을 메모리데이터베이스에 저장하며, 세션의 만료 시간을 설정할 수 있습니다. 일정 시간이 지나면 세션이 만료되어 사용자가 로그아웃 상태가 됩니다.(세션 타임아웃)

*** 쿠키

쿠키 삭제라는 말을 많이 들어보셨을 것입니다. 쿠키는 세션과 비슷한데 웹 서버가 사용자 웹 브라우저에 저장하는 작은 데이터 파일을 의미합니다. 사용자의 상태나 설정 정보를 저장하고, 서버와 클라이언트 간에 데이터를 주고받을 때 유용하게 사용됩니다. 쿠키는 웹사이트에서 사용자의 동작이나 세션 정보를 추적하는 데 중요하게 활용됩니다.

그렇다면 쿠키와 세션의 차이는 무엇일지 궁금할 것입니다.

 

  • 쿠키는 클라이언트에 데이터를 저장하고 서버와 데이터를 주고받는 용도로 사용됩니다.
  • 세션은 서버에서 상태를 관리하는 방식으로, 세션 ID를 쿠키로 전달하여 서버가 사용자 정보를 관리합니다.

 

 

 

 

토큰(Token)

토큰은 사용자가 인증된 후 서버가 발급하는 암호화된 문자열로, 클라이언트가 서버와 통신할 때 인증 정보를 포함해 보내는 방법입니다. 토큰의 대표적인 예는 JWT (JSON Web Token)입니다.

 

  • 사용자가 로그인하면 서버는 사용자의 인증 정보를 기반으로 토큰을 생성하여 클라이언트에게 전달합니다.
  • 클라이언트는 이후 서버와의 모든 요청에 이 토큰을 포함시킵니다. 이때 토큰은 HTTP 헤더쿼리 문자열로 전달될 수 있습니다.
  • 서버는 토큰을 검증하여 사용자의 인증 상태를 확인하고, 토큰이 유효한지 검사합니다.
  • 토큰은 클라이언트에 저장되며, 서버는 클라이언트가 보낸 토큰을 검증하는 방식으로 인증을 처리합니다.

 

 

세션 vs 토큰 비교

특징 세션(Session) 토큰(Token)
저장 위치 서버 (세션 정보) 클라이언트 (주로 쿠키 또는 로컬 스토리지)
상태 관리 서버가 상태를 관리 (Stateful) 클라이언트가 상태를 관리 (Stateless)
확장성 서버가 세션 상태를 관리하므로 확장에 제약이 있음 여러 서버에서 쉽게 확장 가능
보안 세션 ID가 유출되면 위험 토큰이 유출되면 위험
사용성 다른 기기에서 로그인 필요 동일한 토큰으로 여러 기기에서 사용 가능
관리 방식 서버가 세션을 만료시키고 관리 토큰은 클라이언트가 만료 시점까지 보유

 

 

 

비밀번호 암호화

비밀번호 암호화는 말 그대로 비밀번호를 특정 알고리즘을 통해 암호화된 데이터(해시값 또는 암호문)로 저장하는 방식입니다. 이를 통해 비밀번호가 데이터베이스에 저장되더라도, 공격자가 이를 탈취해도 원래의 비밀번호를 알 수 없도록 보장합니다. 

1. 해시함수 : 비밀번호를 일정한 길이의 고정된 문자열로 변환하는 방식. 해시 함수는 단방향 함수로, 원래 값을 복구할 수 없습니다. 

2. 솔트 : 비밀번호 해싱의 보안 강화를 위해 사용자가 입력한 비밀번호에 랜덤한 문자열(Salt)을 추가한 후 해싱하는 방법

3. 키 스트레칭 : 비밀번호 해싱 과정을 여러 번 반복하여 계산을 어렵게 만드는 방법

비밀번호 암호화는 보안을 강화하는 핵심 기술입니다. 그렇기 때문에 어느 하나의 기법만 사용하지 않고 기술을 여러개 사용하여 보안을 강화하고 있습니다. 랜덤한 문자열(Salt)를 포함하여 해싱해주고 키 스트레칭을 통해 여러번 계산해주는 방식으로 암호화를 강화한다고 합니다.

 

 

 

OAuth

Auth를 알아본 뒤에는 OAuth가 있습니다. OAuth는 Open Authorization의 약자로, 사용자가 자신의 인증 정보를 제3자 애플리케이션과 안전하게 공유할 수 있도록 허용하는 권한 부여 프로토콜입니다. 사용자가 자신의 비밀번호나 민감한 정보를 제공하지 않고도, 다른 애플리케이션이 특정 자원에 접근할 수 있도록 허락하는 방식입니다.

 

  • 소셜 로그인: 구글, 페이스북, 트위터 계정으로 다른 웹사이트나 앱에 로그인할 때.
  • API 접근: 애플리케이션이 사용자의 데이터를 가져오기 위해 OAuth를 사용해 권한을 요청합니다. 예를 들어, 특정 서비스의 데이터를 외부 애플리케이션에서 가져오는 경우.
  • 타 서비스와의 연동: 예를 들어, 사용자가 트위터 계정을 통해 다른 서비스를 사용할 수 있도록 하는 방식.

 

 

 

 

마치며

오늘은 auth에 대해 알아보았습니다. 로그인, 회원 가입을 할 때 내 정보가 그대로 저장된다면 공격이나 제3자가 개인정보를 악용할 위험성이 있습니다. 해당 에러를 보안하기 위해 사용하는 기술이 auth입니다. auth에서는 세션과 토큰, 비밀번호 암호화, Oauth가 있습니다. 요즘엔 Oauth로 자주 사용하는 추세인 것 같습니다. 이전에 firebase로 구현한 경험이 있는데 기회가 된다면 firebase로도 토이프로젝트를 해보면 좋을 것 같습니다. 지금 구현중인 프로젝트에서는 직접 세션과 토큰을 사용해보고자 합니다. 또한 데이터를 저장할 때 비밀번호 암호화하는 알고리즘도 생성하여 비밀번호를 저장하도록 하겠습니다.

부족한 점이나 수정 사항 있으면 댓글로 알려주세요!

 

 

참고

https://velog.io/@sooran/Auth%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EB%AF%BC%EB%93%A4#0-%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0

Oauth 참고 내용 : https://hudi.blog/oauth-2.0/

728x90