OAuth2 Deepdive

๐Ÿ”” Oauth2 ์ ์šฉ ์ „ ๐Ÿ”” Oauth2 ์‹ค์Šต ๊ฐœ์š” ์ตœ๊ทผ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์„ค์ •ํ•˜๊ณ  ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ์— ๋งž๊ฒŒ ๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ์ง„ํ–‰์„ ํ–ˆ์œผ๋‚˜โ€ฆ ์•„๋ฌด๋ฆฌ ๋ด๋„ ๊ณผ์ • ํ•˜๋‚˜ ํ•˜๋‚˜๋ฅผ ๋‚ด ์†์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ๋งž๋Š”๊ฑด๊ฐ€? ๋ผ๋Š” ์˜๋ฌธ์„ ์‹œ์ž‘์œผ๋กœ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ดค๊ณ , ๊ทธ๋ ‡๊ฒŒ Oauth 2.0์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ์‹์„ ์ฐพ๊ฒŒ ๋˜์—ˆ๋‹ค. Oauth2 ์ ์šฉ ์ „ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๋– ๋‚˜์„œ ์ง€๊ธˆ ์™€์„œ ๋ณด๋‹ˆ ๋งˆ์น˜ Oauth 1.0์ฒ˜๋Ÿผ ๊ตฌํ˜„์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋‚˜ ๋˜ํ•œ, ๊ฐ ํ”Œ๋กœ์šฐ๋งˆ๋‹ค ํ•˜๋“œ ์ฝ”๋”ฉ์€ ์ค„์ด๊ณ  ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์žฌํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ๋ณด์•ˆ ์š”์†Œ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด์„œ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค. ...

January 18, 2025 11:48 ยท 4 min ยท 768 words ยท nakji

OAuth2

๐Ÿ”” Oauth2? ๊ทธ๋Ÿผ Oauth1๋„? ๐Ÿ”” Oauth2 ๋™์ž‘ ๊ณผ์ • RFC6749(Oauth 2.0) ๋ฌธ์„œ๋ฅผ ํ† ๋Œ€๋กœ ์š”์•ฝํ•˜์—ฌ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ˆ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. What? Why? ์ธ์ฆ(authentication) ์ด ์•„๋‹Œ ์ธ๊ฐ€(authorization)์— ์ดˆ์ ์„ ๋งž์ถ”๋ฉฐ, ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ž์‹ ์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ œํ•œ์  ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์—ญํ•  Resource Owner ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค(Protected Resource)์˜ ์‹ค์ œ ์†Œ์œ ์ž ํ˜น์€ ์ฃผ์ฒด ex) ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •, ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ Resource Server ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ˜ธ์ŠคํŒ…(์ €์žฅ ๋ฐ ๊ด€๋ฆฌ)ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์œ ํšจํ•œ ํ† ํฐ์ด๋ฉด ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์„ ํ—ˆ์šฉ Client ...

January 17, 2025 17:23 ยท 3 min ยท 450 words ยท nakji

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ธฐ๋ณธ

๐Ÿ”” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ฐœ๋… ์Šคํ”„๋ง ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ๊ธฐ๋ณธ์„ ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค. WebSecurityConfig @Configuration @EnableWebSecurity public class WebSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { RequestCache nullRequestCache = new NullRequestCache(); http .requestCache((cache) -> cache .requestCache(nullRequestCache) ) .authorizeHttpRequests((requests) -> requests .requestMatchers("/", "/home").permitAll() .anyRequest().authenticated() ) .formLogin((form) -> form .loginPage("/login") .permitAll() ) .logout((logout) -> logout.permitAll()); return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); } } @EnableWebSecurity๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ํ™œ์„ฑํ™”์‹œํ‚ค๊ณ  securityFilterChain์™€ userDetailsService๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค. ...

December 20, 2024 17:50 ยท 3 min ยท 636 words ยท nakji

AES/CBC/PKCS7

์šฉ์–ด ์ž์ฒด๊ฐ€ ๊ฑฐ์ฐฝํ•ด๋ณด์ด์ง€๋งŒ ํ•˜๋‚˜์”ฉ ํ•ด์„ํ•ด๋ณด๋ฉด AES ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ด๊ณ  CBC๋Š” ๋ธ”๋ก ๋‹จ์œ„๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•˜๋Š” AES ๋ฐฉ์‹์˜ ์šด์˜๋ชจ๋“œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. PKCS7์€ AES128 ๋ฐฉ์‹์„ ์“ด๋‹ค๊ณ  ํ•˜๋ฉด, 128๋น„ํŠธ๋ณด๋‹ค ์ž‘์€ ๋ธ”๋ก์ด ๋‚˜์˜ค๋ฉด ๋’ค์— ๊ฐ’์„ ๋ถ™์—ฌ์ฃผ๋Š” โ€˜ํŒจ๋”ฉโ€˜์˜ ํ•œ ๋ฐฉ์‹์ด๋‹ค. ํฌ๊ฒŒ ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ ๋Œ€์นญํ‚ค, ๋น„๋Œ€์นญํ‚ค ๋ฐฉ์‹์ด ์žˆ๋‹ค. ๋Œ€์นญํ‚ค๋Š” ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”์— ์“ฐ์ด๋Š” ํ‚ค๊ฐ€ ๊ฐ™์•„์„œ ์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ ํ•ด๋‹น ํ‚ค๊ฐ’์ด ๋…ธ์ถœ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ณ  ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค. ์œ„์—์„œ ๋งํ•œ AES๋Š” DES๋ฐฉ์‹์˜ ๊ฒฐํ•จ์ด ๋ฐœ๊ฒฌ๋˜์–ด ์ฑ„ํƒ๋œ ๋ฐฉ์‹์œผ๋กœ 128/192/256๋น„ํŠธ์˜ ๊ณ ์ • ๋ธ”๋ก ๋‹จ์œ„๋กœ ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํŠนํžˆ ๋ธ”๋ก ์•”ํ˜ธํ™” ๋ฐฉ์‹์€ ํ‰๋ฌธ์˜ ๊ธธ์ด์™€ ์ƒ๊ด€์—†์ด ๊ณ ์ •๋œ ๊ธธ์ด๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ...

July 12, 2022 14:23 ยท 1 min ยท 188 words ยท nakji