[Security] Secure Coding(6-1) - ORM
[Security] Secure Coding(6-1) - ORM
๐ ์ํ์ด ์ฝ๋ฉ ์์ ์ ๋ฆฌ
ORM ํ๋ ์์ํฌ
๐ORM: ๊ฐ์ฒด ์งํฅ ์ธ์ด์ ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํํ๋ ๊ธฐ์
โ ORM ํ์์ฑ:
- ๋ถ์ผ์น ๋ฌธ์ ํด๊ฒฐ: ๊ฐ์ฒด ๋ชจ๋ธ๊ณผ ์คํค๋ง ๊ฐ ๋ถ์ด์น ํด์
- ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์: SQL ์ง์ ์์ฑ ๋ถ๋ด ๊ฐ์, ์ฝ๋ ๊ฐ๊ฒฐํ
- ์ ์ง๋ณด์์ฑ ๋ฐ ๋ณด์ ๊ฐํ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ์ถ์ํ๋ก ๋ณด์ ์ทจ์ฝ์ (์: SQL Injection) ์ต์ํ
์ ํต์ SQL ์ฟผ๋ฆฌ VS ORM ๋น๊ต
๊ฐ๊ฐ ์ ์์ ํน์ง ๋น๊ต
์ฅ์ ๊ณผ ๋จ์ ๋น๊ต
- ์ ํต์ SQL ์ฟผ๋ฆฌ ๋ฐฉ์์ด ์ ํฉํ ๊ฒฝ์ฐ
- ์ฑ๋ฅ ํ๋์ด ์ค์ํ ๊ฒฝ์ฐ
- ๋ณต์กํ ๋ค์ค ์กฐ์ธ ์ฟผ๋ฆฌ ์์ฑ ์
- ํน์ DBMS ๊ณ ์ ๊ธฐ๋ฅ(์: ์ ์ฅ ํ๋ก์์ , ์๋์ฐ ํจ์)์ ์ ๊ทน ํ์ฉํ ๋
- ORM ์ฌ์ฉ์ด ์ ํฉํ ๊ฒฝ์ฐ
- CRUD ์ค์ฌ์ ์ ํ๋ฆฌ์ผ์ด์ , ๋น ๋ฅธ ํ๋กํ ํ์ดํ ๋ฐ ์ ์ง๋ณด์๊ฐ ์ค์ํ ๊ฒฝ์ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฆฝ์ฑ์ด ํ์ํ๊ฑฐ๋ ๊ฐ์ฒด ์งํฅ ํจ๋ฌ๋ค์์ ์ ํธํ ๋
ORM ์ฃผ์ ๊ธฐ๋ฅ
- ๋งคํ ๊ธฐ๋ฅ
- ๊ฐ์ฒด-ํ
์ด๋ธ ๋งคํ
- ํด๋์ค์ ํ ์ด๋ธ, ํ๋์ ์ปฌ๋ผ์ ์๋ ๋งคํ โ SQL ์์ฑ ์์ด ๋ฐ์ดํฐ ์กฐ์
- ๊ด๊ณ ๋งคํ
1:1
,1:N
,N:M
๊ด๊ณ๋ฅผ ์ด๋ ธํ ์ด์ ๋๋ XML ์ค์ ์ ํตํด ์ ์ ๋ฐ ๊ด๋ฆฌ
- ์๋ ์คํค๋ง ์์ฑ
- ๋๋ฉ์ธ ๋ชจ๋ธ ๋ณ๊ฒฝ์ ๋ฐ๋ผ DB ์คํค๋ง๋ฅผ ์๋ ์์ฑํ๊ฑฐ๋ ์ ๋ฐ์ดํธ ๊ฐ๋ฅ
- ๊ฐ์ฒด-ํ
์ด๋ธ ๋งคํ
- CRUD ์์
์ง์
Create
,Read
,Update
,Delete
๊ธฐ๋ฅ์ ๊ฐ์ฒด ์กฐ์๋ง์ผ๋ก ์ฒ๋ฆฌ- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์ ์ ๊ทผ ์์ด, ๊ฐ์ฒด ์ํ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์๋ ๋๊ธฐํ(
DIRTY CHECKING
)
- ๊ณ ๊ธ ์ฟผ๋ฆฌ ๊ธฐ๋ฅ
- ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด (HQL, JPQL ๋ฑ)
- SQL๋ณด๋ค ์ถ์ํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ์กฐํ ๋ฐ ์กฐ์ ๊ฐ๋ฅ
- Criteria API
- ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋์ ์ฟผ๋ฆฌ ์์ฑ ์ง์
- ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ ์ง์
- ํ์์ ์ง์ SQL์ ์คํํ ์ ์๋ ๊ธฐ๋ฅ ์ ๊ณต
- ๊ฐ์ฒด ์งํฅ ์ฟผ๋ฆฌ ์ธ์ด (HQL, JPQL ๋ฑ)
- Lazy Loading & ์บ์ฑ
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading)
- ์ค์ ์ฌ์ฉ ์์ ์ ์ฐ๊ด ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ์ฌ ์ด๊ธฐ ๋ก๋ฉ ๋น์ฉ ์ ๊ฐ
- 1์ฐจ/2์ฐจ ์บ์
- ๋์ผ ์ธ์ (1์ฐจ ์บ์) ๋ด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ(2์ฐจ ์บ์)์์ ์บ์๋ฅผ ํ์ฉํด ์ฑ๋ฅ ์ต์ ํ
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading)
- ํธ๋์ญ์
๊ด๋ฆฌ
- ์๋ ํธ๋์ญ์
์ฒ๋ฆฌ
- ๋ช ์์ ํธ๋์ญ์ ์์ด, ORM ํ๋ ์์ํฌ๊ฐ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ๊ด๋ฆฌ
- ์ผ์ผํ ์ปค๋ฐ๊ณผ ๋กค๋ฐฑ ์ฝ๋๋ฅผ ์์ฑ ์ํด๋ ๋จ
- ๋์์ฑ ์ ์ด ๋ฐ ๋๊ด์ /๋น๊ด์ Lock ์ง์
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ฉฐ ์ฌ๋ฌ ์ฌ์ฉ์์ ๋์ ์ ๊ทผ ์ฒ๋ฆฌ
- ๋๊ด์ Lock: ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ๋ฒ์ ์ ์ฝ๊ณ ์์ ํ ๋ ๋ฒ์ ๋ฒํธ ํ์ธ โ ๋ฒ์ ์ด ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ์ฌ๋์ด ๋จผ์ ์์ ํจ, ์ฆ ์ถฉ๋!
- ๋น๊ด์ Lock: ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ DB์์ Lock์ ๊ฑธ๊ณ ์์ , ์์ ์๋ฃ ํ Lock ํด์
- ์๋ ํธ๋์ญ์
์ฒ๋ฆฌ
- ๊ธฐํ ๋ถ๊ฐ ๊ธฐ๋ฅ
- ์ฐ๊ด ๊ด๊ณ ๋ฐ Fetch ์ ๋ต
- ์ฐ๊ด ๊ฐ์ฒด ๋ก๋ฉ ์ ๋ต ์ค์ ์ผ๋ก ์ฑ๋ฅ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
- ์ ์ฐํ ์ค์ ๋ฐ ํ์ฅ์ฑ
- XML, ์ด๋ ธํ ์ด์ , ํ๋ฌ๊ทธ์ธ ๋ฑ์ ํตํ ๋ค์ํ ์ค์ ์ต์ ๊ณผ ํ์ฅ์ฑ ์ ๊ณต
- ์ฐ๊ด ๊ด๊ณ ๋ฐ Fetch ์ ๋ต
MyBatis ํ๋ ์์ํฌ ํ์ฉ
๐MyBatis: Java Persistence ํ๋ ์์ํฌ๋ก, SQL ์ฟผ๋ฆฌ์ ์๋ฐ ๊ฐ์ฒด ๊ฐ์ ๋งคํ์ ์ง์
- ๊ฐ๋ฐ์๊ฐ ์ง์ SQL์ ์์ฑํ ํ, XML์ด๋ ์ด๋ ธํ ์ด์ ์ ํตํด ๋งคํ์ ์ค์ ํ์ฌ DB์ ์ํธ์์ฉ
โ ํน์ง:
- ๋ณต์กํ ์ฟผ๋ฆฌ์ ์ต์ ํ์ ์ ๋ฆฌ
- ORM์ ์ถ์ํ ์์ด ์ง์ SQL ์์ฑ์ผ๋ก๋ง ์ธ๋ฐํ ์ ์ด ๊ฐ๋ฅ
- XML, ์ด๋ ธํ ์ด์ ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋งคํ ์ค์ ๊ฐ๋ฅ
MyBatis ์ฃผ์ ๊ธฐ๋ฅ
- SQL ๋งคํ ๋ฐ ์คํ
- Mapper ํ์ผ(
XML
) ๋๋ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก SQL ๋ฌธ์ ์ ์ - SQL ๋ฌธ๊ณผ ์๋ฐ ๊ฐ์ฒด ๊ฐ์ ์๋ ๋งคํ ์ ๊ณต
- Mapper ํ์ผ(
- ๋์ SQL ์ง์
- ์กฐ๊ฑด๋ฌธ(
<if>
,<choose>
) ๋ฐ ๋ฐ๋ณต๋ฌธ(<foreach>
)์ ์ฌ์ฉํ์ฌ ์ ์ฐํ ์ฟผ๋ฆฌ ์์ฑ ๊ฐ๋ฅ
- ์กฐ๊ฑด๋ฌธ(
- ํ์
ํธ๋ค๋ฌ(Type Handler)
- ์๋ฐ ๊ฐ์ฒด์ DB ๋ฐ์ดํฐ ๊ฐ ๋ณํ์ ์ํ ์ฌ์ฉ์ ์ ์ ํ์ ํธ๋ค๋ฌ ์ง์
- ํ๋ฌ๊ทธ์ธ ๊ธฐ๋ฅ
- ์ธํฐ์ ํฐ๋ฅผ ํตํด ์ฟผ๋ฆฌ ์คํ ์ /ํ ๋ก์ง์ ํ์ฅํ๊ฑฐ๋ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ
Mybatis ์ค์ ๋ฐ ๊ตฌ์ฑ
- ์ค์ ํ์ผ(mybatis-config.xml)
- ํ๊ฒฝ(๋ฐ์ดํฐ์์ค, ํธ๋์ญ์ ๋งค๋์ ๋ฑ) ์ค์ ๋ฐ ์ ์ญ ์ต์ ๊ตฌ์ฑ
- Mapper ํ์ผ ๊ตฌ์ฑ
- SQL ๋ฌธ๊ณผ ๋งคํ ์ ๋ณด๋ฅผ ๋ด์ XML ํ์ผ ๋๋ ์ด๋ ธํ ์ด์ ์ฌ์ฉ
- ๋ค์์คํ์ด์ค๋ฅผ ํตํด Mapper๋ฅผ ๊ตฌ๋ถํ๊ณ ์ฌ์ฌ์ฉ์ฑ ํฅ์
- ๋ฐ์ดํฐ ์์ค ๋ฐ ์ธ์
๊ด๋ฆฌ
- DB ์ปค๋ฅ์
ํ๊ณผ
SqlSessionFactory
๋ฅผ ์ด์ฉํด ์ธ์ ์์ฑ ๋ฐ ๊ด๋ฆฌ - ์คํ๋ง๊ณผ ์ฐ๋ ์, ์คํ๋ง ๋ถํธ ์๋ ์ค์ ๋ฐ ํตํฉ ํ์ฉ
- DB ์ปค๋ฅ์
ํ๊ณผ
Mybatis ์ฅ๋จ์ ๋ฐ ์ฌ๋ก
โ ์ฅ์ :
- SQL์ ์ง์ ์์ฑํ๋ฏ๋ก, ๋ณต์กํ ์ฟผ๋ฆฌ ๋ฐ ์ฑ๋ฅ ํ๋์ ์ ๋ฆฌ
- ORM๋ณด๋ค ๊ฐ๋จํ ์ค์ ์ผ๋ก ๋ฐ์ดํฐ ๋งคํ์ ๊ด๋ฆฌ
- DB ์์ ์ ์ ๊ณผ์ ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ด๋ฆฌ ๊ฐ๋ฅ
โ๋จ์ :
- ์ง์ SQL ์์ฑ ์, ๋น์ทํ ์ฟผ๋ฆฌ์ ์ค๋ณต ๊ด๋ฆฌ ํ์
- ORM์ฒ๋ผ ์์ ํ ๊ฐ์ฒด ๊ด๊ณ ์๋ ๋งคํ์ ์ ๊ณตํ์ง ์์
- XML/์ด๋ ธํ ์ด์ ๋งคํ ํ์ผ ๊ด๋ฆฌ ๋ฐ ๋์ SQL ์์ฑ์ ๋ํ ํ์ต ํ์
๐ก์ฌ์ฉ ์ฌ๋ก:
- ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋ณต์กํ ์ฟผ๋ฆฌ ์ต์ ํ๊ฐ ์๊ตฌ๋๋ ์ ํ๋ฆฌ์ผ์ด์
- ๊ธฐ์กด JDBC์ ๋ฐ๋ณต ์์ ์ ์ค์ด๋ฉด์๋ ์ธ๋ฐํ SQL ์ ์ด๊ฐ ํ์ํ ํ๋ก์ ํธ
ORM ์ฌ์ฉ ์ ๋ณด์ ์ด์
- ORM์ ์ญํ
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ ๋งคํ์ ์๋ํํ์ฌ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋์
- SQL์ ์ง์ ์์ฑํ์ง ์๊ณ ๋ CRUD ๋ฐ ๋ณต์กํ ์ฟผ๋ฆฌ ์ํ ๊ฐ๋ฅ
- ๋ณด์ ์ด์์ ์ค์์ฑ
- ORM ์์ฒด๊ฐ
SQL Injection
๋ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฉ์ดํ์ง๋ง, ์๋ชป๋ ์ฌ์ฉ ์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ ์ ์์ - ๋งคํ, ์บ์ฑ, ๋์ ์ฟผ๋ฆฌ ๋ฑ ์ฌ๋ฌ ์์๊ฐ ๋ณด์์ ์ํฅ์ ๋ฏธ์น ์ ์์
- ORM ์์ฒด๊ฐ
SQL Injection + ๋์ ์ฟผ๋ฆฌ ์ทจ์ฝ์
๊ธฐ๋ณธ์ ์ธ ORM์ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ผ๋ก ๋ณดํธ๋์ง๋ง, ๋์ ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ์์ด ๊ฒฐํฉ ๋ฐฉ์์ผ๋ก ์์ฑํ๋ฉด SQL ์ธ์ ์ ๋ฐ์ํ ์ ์์
โ Native Query ์ฌ์ฉ ์ ์ฃผ์ ํ์!
โ ๋์ ๋ฐฉ์:
- ํญ์ ์์ ํ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํจ
- ๋์ ์ฟผ๋ฆฌ ์์ฑ ์ - ORM์ด ์ ๊ณตํ๋ ๋์ SQL ํ๊ทธ(์: MyBatis์
if
,choose
๋ฑ) ์ฌ์ฉ - Native Query ์ฌ์ฉ ์ ๋ณ๋ ๊ฒ์ฆ ๋ฐ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ์ฒ ์
์บ์ฑ ๋ฐ ์ง์ฐ ๋ก๋ฉ ๊ด๋ จ ๋ณด์ ์ด์
- ์บ์ฑ ์ทจ์ฝ์
- 2์ฐจ ์บ์๋ ๊ณต์ ์บ์ ์ค์ ์ ๋ฏผ๊ฐ ๋ฐ์ดํฐ๊ฐ ์๋์น ์๊ฒ ๋ ธ์ถ๋ ๊ฐ๋ฅ์ฑ
- ์บ์ ๋ฌด๊ฒฐ์ฑ ๊ด๋ฆฌ ๋ฏธํก ์, ์บ์ ๋ณ์กฐ ๊ณต๊ฒฉ(
Cache Poisoning
) ์ํ
- ์ง์ฐ ๋ก๋ฉ ๋ฐ ๋ฐ์ดํฐ ๋
ธ์ถ
- ํ์ ์ด์์ผ๋ก ์ฐ๊ด๋ ๋ฐ์ดํฐ๊ฐ ์ง์ฐ ๋ก๋ฉ๋์ด, ์์์น ๋ชปํ ๋ฐ์ดํฐ ๋ ธ์ถ ๋ฐ์ ๊ฐ๋ฅ
- ORM ๋งคํ ์ ๋ฏผ๊ฐ ์ ๋ณด๊ฐ ํฌํจ๋ ์ํฐํฐ๋ฅผ ๋ถํ์ํ๊ฒ ๋ก๋ํ๋ ๋ฌธ์
โ ๋์ ๋ฐฉ์:
- ์บ์ ์ค์ ์ ๋ฏผ๊ฐ ๋ฐ์ดํฐ ์ ์ธ ๋ฐ ์ ๊ทผ ์ ์ด ๊ฐํ
Lazy Loading
์ค์ ๊ณผ ์ฐ๊ด ๋ฐ์ดํฐ ์กฐํ ์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ ํ์ ์ผ๋ก ๋ก๋ํ๋๋ก ์ค๊ณ
๋งคํ, ์ค์ ๋ฐ ๊ถํ ๊ด๋ฆฌ ์ทจ์ฝ์
- ์๋ชป๋ ๋งคํ ์ค์
- ์ํฐํฐ ๋งคํ ์ค๋ฅ๋ก ์ธํ ๋ฐ์ดํฐ ๋๋ฝ ๋๋ ๊ณผ๋ํ ๋ฐ์ดํฐ ๋ ธ์ถ
- ์๋ฐฉํฅ ๋งคํ ๋ฐ ์ฐ๊ด ๊ด๊ณ ์ค์ ๋ฏธํก ์, ๋ฌดํ ๋ฃจํ ๋๋ ๋ถํ์ํ ๋ฐ์ดํฐ ๋ก๋ ๋ฐ์
- Mass Assignment (๋๋ ํ ๋น) ์ทจ์ฝ์
- ํด๋ผ์ด์ธํธ ์ ๋ ฅ ๊ฐ์ ๊ทธ๋๋ก ์ํฐํฐ์ ๋ฐ์ธ๋ฉํ ๊ฒฝ์ฐ, ์์น ์๋ ํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
โ ๋์ ๋ฐฉ์:
- ์ํฐํฐ ๋งคํ ์ - ๋ฏผ๊ฐ ํ๋๋ ๋ช ์์ ์ผ๋ก ์ ์ธํ๊ฑฐ๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์
- ์ ๋ ฅ๊ฐ ๊ฒ์ฆ๊ณผ DTO(Data Transfer Object)๋ฅผ ํ์ฉํ์ฌ, ๋๋ ํ ๋น ๊ณต๊ฒฉ ๋ฐฉ์ง
This post is licensed under CC BY 4.0 by the author.