안녕하세요! 오늘은 현대 웹 서비스에서 빼놓을 수 없는 인증 프로토콜인 OAuth 2.0에 대해 알아볼게요.
OAuth 2.0은 마치 호텔의 키 카드 시스템과 비슷해요. 호텔에 체크인하면 신분증을 확인한 후 특정 방에만 들어갈 수 있는 키 카드를 줍니다. 마찬가지로 OAuth는 사용자의 신원을 확인한 후, 필요한 권한만 가진 '키'(토큰)를 제공하는 시스템이에요.
등장 배경
과거에는 어떻게 했을까요? 🕰️
예전에는 외부 서비스를 이용하기 위해 직접 아이디와 비밀번호를 제공해야 했어요. 마치 친구 집에 들어가기 위해 집 열쇠 전체를 빌리는 것과 같았죠! 이런 방식은 안전할까요? 당연히 아니죠!
- 보안 위험: 제3자 앱에 비밀번호 노출
- 과도한 권한: 모든 접근 권한을 제공
- 변경 문제: 비밀번호 변경 시 모든 연동 앱 업데이트 필요
이러한 문제를 해결하기 위해 OAuth 1.0이 2007년에 등장했고, 2012년 더 단순하고 확장성 있는 OAuth 2.0으로 발전했어요.
OAuth 2.0이 해결하는 문제점:
- 안전한 인증: 비밀번호 공유 없이도 인증 가능 😎
- 권한 세분화: 필요한 권한만 부여 가능 👍
- 사용자 경험: 간편한 로그인으로 편의성 향상 ✨
핵심 원리
OAuth 2.0은 네 가지 주요 역할자가 있어요:
1. 주요 역할자
1. 리소스 소유자(Resource Owner): 데이터의 실제 주인(사용자)
2. 클라이언트(Client): 접근을 요청하는 앱/서비스
3. 권한 부여 서버(Authorization Server): 인증/권한 부여 담당
4. 리소스 서버(Resource Server): 보호된 데이터 보유
2. 권한 부여 방식(Grant Types)
가장 일반적인 Authorization Code Flow를 살펴볼까요?
+--------+ +---------------+
| |--(A)-- 인증 요청 ---------->| |
| | | 권한 부여 서버 |
| |<-(B)-- 인증 코드 ------------| |
| | +---------------+
| 클라이언트 |
| | +---------------+
| |--(C)-- 인증 코드로 토큰 요청->| |
| | | 리소스 서버 |
| |<-(D)-- 접근 토큰 ------------| |
+--------+ +---------------+
이외에도 더 간단한 Implicit Grant, 서버간 통신을 위한 Client Credentials Grant, 높은 신뢰 앱을 위한 Password Grant 등이 있어요.
3. 토큰 종류
* Access Token: 실제 접근에 사용 (수명이 짧음)
* Refresh Token: 토큰 갱신에 사용 (수명이 김)
* ID Token: 사용자 정보를 담음 (OpenID Connect)
사례 소개
실제로 우리 일상에서 OAuth 2.0은 어디에 쓰일까요? 🌏
- 소셜 로그인: 구글, 페이스북, 깃허브 계정으로 로그인
- API 접근: Spotify 플레이리스트 관리, Trello 작업 자동화
- 엔터프라이즈 환경: 사내 시스템 통합 인증 (SSO)
Spring Boot에서의 구현 예시:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/login**").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login();
}
}
Node.js에서의 구현 예시:
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
passport.use(new GoogleStrategy({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: "/auth/google/callback"
},
function(accessToken, refreshToken, profile, done) {
// 사용자 정보 처리
return done(null, profile);
}
));
주의사항 및 팁 💡
⚠️ 이것만은 주의하세요!
- 토큰 관리
- Access Token은 항상 안전하게 저장 (localStorage 사용 지양)
- HTTPS 사용은 필수!
- 토큰 만료 시간 적절히 설정 (보통 1시간 이내)
- CSRF 공격 방지
- 요청마다 고유한 state 파라미터 사용
- 콜백에서 state 값 검증
- 리디렉션 URI 검증
- 등록된 URI만 허용하도록 설정
- 와일드카드(*) 사용은 피하기
💡 꿀팁
- PKCE(Proof Key for Code Exchange) 확장을 사용하면 코드 가로채기 공격을 방지할 수 있어요
- 모바일 앱은 Custom URL Scheme 또는 Universal Links 사용하기
- 토큰 갱신 로직은 자동화해서 사용자 경험 향상시키기
- OAuth 2.0만으로는 인증이 아닌 권한 부여만 제공, 사용자 정보가 필요하다면 OpenID Connect 추가하기
장단점 비교
장점 👍
- 사용자 비밀번호 노출 없는 안전한 인증
- 권한 세분화로 보안 강화
- 표준화된 프로토콜로 다양한 서비스와 호환
- 사용자 경험 개선
단점 👎
- 구현 복잡성
- 잘못 구현 시 보안 취약점 발생 가능
- 추가 통신으로 인한 성능 부담
- 토큰 관리 로직 필요
마치며
지금까지 OAuth 2.0에 대해 알아보았습니다. 처음에는 복잡하게 느껴질 수 있지만, 이해하고 나면 현대 웹 서비스의 안전한 인증과 권한 관리에 필수적인 기술임을 알 수 있을 거예요! 😊
참고 자료 🔖
#OAuth #인증 #보안 #웹개발 #API
'800===Dev Docs and License > Web Security' 카테고리의 다른 글
JWT 토큰 인증 - 안전한 웹 서비스를 위한 현대적 인증 방식 🔐 (0) | 2025.03.27 |
---|---|
대칭키 및 비대칭키 암호화 알고리즘 쉬운 설명 (0) | 2025.02.15 |
SHA Introduced (0) | 2024.06.04 |
RSA Introduced (0) | 2024.06.04 |
RSA Key Cryptosystem Introduced (0) | 2024.05.31 |